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ę.

użytkownik79658
źródło
stackoverflow.com/questions/7804673/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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.

Michael Homer
źródło
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
phk
źródło
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
Srini
źródło
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
Cuonglm
źródło
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
Mężczyzna
źródło
Staraj się być trochę bardziej gadatliwy w swojej odpowiedzi
ddnomad