Çift tırnak işaretleri arasında değer çıkar


16

Benim sorgu çift tırnak arasındaki değeri ayıklamaktır "". Örnek girdi:

10.219.41.68 - - - [11 / Haz / 2014: 10: 23: 04 -0400] Sn: 0 MicSec: 1797 "GET / dengeleyici yöneticisi HTTP / 1.1" 200 28980 "-" "kıvırmak / 7.15.5 (i386 -kırmızı-linux-gnu) libcurl / 7.15.5 OpenSSL / 0.9.8b zlib / 1.2.3 libidn / 0.6.5 "

Ben büyük günlük dosyaları var, bu yüzden değerler her satır için değişebilir, çift tırnak ilk oluşumu arasındaki değeri ayıklamak gerekir…

Beklenen çıktı:

GET /balancer-manager HTTP/1.1

Herkes herhangi bir fikir var o zaman lütfen önermek.


Yanıtlar:


27

Sadece bunun için kullanabilirsiniz cut:

$cut -d '"' -f2 < logfile
GET /balancer-manager HTTP/1.1

-d '"'cutalan ayırıcısı olarak çift tırnak kullanmasını söyler . -f2ona, birinci ve ikinci tırnak işaretleri arasındaki ikinci alanı - ya da ilk alıntılanan dizeyi, tam olarak ne istediğinizi almasını söyler.


Tüm çift sayılı sütunları nasıl kolayca kesilir %!cut -d '"' -f2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58?
hhh

10

Kullanmanın bir yolu awk

awk -F'"' '$0=$2' file

Bazı saçma nedenlerden dolayı HTTP yöntemleriniz aslında 0ve bunları çıktılamak istiyorsanız

awk -F'"' '{$0=$2}1' file

Ya boşsa $2?
cuonglm

Sonra yazdırmayacak? Cevabınızla aynı olmayacak. Tek fark, cevabınız 2 $ olmayan her kayıt için boş bir satır basacak.

Hayır, cevabım boş bir sayfa yazdırıyor. Ve değerin 0sadece boş olmadığını hayal edin ?
cuonglm

Sorunun bağlamının sorun olmayacağını düşünürdüm.

Hızlı yanıtlarınız için hepinize teşekkürler ... Bu benim için gerçekten yararlı. Çok teşekkürler!
user79658

4

A awkve perlçözümleri zaten sağlandığından, denemek istedim sed:

sed 's/[^"]*"\([^"]*\)".*/\1/' file

2

Bunu birçok şekilde yapabilirsiniz.

İle awk:

$ awk -F'"' '{print $2}' file
GET /balancer-manager HTTP/1.1

İle perl:

$ perl -F'"' -anle 'print $F[1]' file
GET /balancer-manager HTTP/1.1

0

alıntılanan giriş numaralarının işlenmesi

echo   1234   | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # no problem
echo '"1234"' | awk '{                i=strtonum($1) ;  printf( "%s %d\n",$1, i)}'  # does not work
echo '"1234"' | awk '{ gsub("\"",""); i = $1         ;  printf( "%s %d\n",$1, i)}'  # works

Cevabınızda biraz daha ayrıntılı olmaya çalışın
ddnomad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.