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.