Wyodrębnij wartość między podwójnymi cudzysłowami


16

Moje zapytanie polega na wyodrębnieniu wartości między podwójnymi cudzysłowami "". Przykładowe dane wejściowe to:

10.219.41.68 - - - [11 / Jun / 2014: 10: 23: 04 -0400] Sec: 0 MicSec: 1797 "GET / balancer-manager HTTP / 1.1" 200 28980 "-" "curl / 7.15.5 (i386 -redhat-linux-gnu) libcurl / 7.15.5 OpenSSL / 0.9.8b zlib / 1.2.3 libidn / 0.6.5 "

Mam duże pliki dziennika, więc wartości mogą się różnić dla każdej linii, trzeba wyodrębnić wartość między pierwszym wystąpieniem podwójnych cudzysłowów…

Oczekiwany wynik:

GET /balancer-manager HTTP/1.1

Jeśli ktoś ma jakiś pomysł, proszę o sugestię.


Odpowiedzi:


27

Możesz po prostu użyć cutdo tego:

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

-d '"'mówi, cutaby użyć podwójnego cudzysłowu jako ogranicznika pola. -f2każe mu wziąć drugie pole, które znajduje się między pierwszym a drugim cudzysłowem - lub pierwszym ciągiem cytowanym - dokładnie tym, czego chcesz.


Jak łatwo wydrukować wszystkie parzyste kolumny w wycięciu %!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

Sposób użycia awk

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

Jeśli z jakiegoś absurdalnego powodu twoje metody HTTP są w rzeczywistości 0i chcesz je wyprowadzić

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

Co jeśli $2jest zerowy?
— cuonglm

Więc to nie wydrukuje? To samo, co nie będzie w twojej odpowiedzi. Jedyną różnicą jest to, że twoja odpowiedź wydrukuje pusty wiersz dla każdego rekordu bez 2 $.

Nie, moja odpowiedź drukuje puste miejsce jak. I wyobraź sobie, że wartość jest 0nie tylko zerowa?
— cuonglm

Wyobrażam sobie, biorąc pod uwagę kontekst pytania, które nie stanowiłyby problemu.

Dziękuję wszystkim za szybkie odpowiedzi ... Jest to dla mnie naprawdę pomocne. Wielkie dzięki!
— user79658,

4

Ponieważ rozwiązania awki perlsą już dostępne, chciałem spróbować sed:

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

2

Możesz to zrobić na wiele sposobów.

Z awk:

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

Z perl:

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

0

przetwarzanie podanych liczb wejściowych

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

Staraj się być trochę bardziej gadatliwy w swojej odpowiedzi
— ddnomad
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.