Estrai il valore tra virgolette doppie


16

La mia domanda è estrarre il valore tra virgolette doppie "". L'input di esempio è:

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 "

Ho file di registro di grandi dimensioni, quindi i valori possono variare per ogni riga, è necessario estrarre il valore tra la prima occorrenza di virgolette doppie ...

Uscita prevista:

GET /balancer-manager HTTP/1.1

Qualcuno ha qualche idea quindi per favore suggerisci.


Risposte:


27

Puoi semplicemente usare cutper questo:

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

-d '"'dice cutdi usare una doppia virgoletta come delimitatore di campo. -f2gli dice di prendere il secondo campo, che è tra la prima e la seconda virgoletta - o la prima stringa tra virgolette, esattamente quello che vuoi.


Come stampare facilmente tutte le colonne con numerazione pari tagliate %!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

Un modo di usare awk

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

Se per qualche ragione assurda i tuoi metodi HTTP sono effettivamente 0e vuoi emetterli

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

E se $2fosse nullo?
cuonglm,

Quindi non lo stampa? Lo stesso che non sarà nella tua risposta. L'unica differenza è che la tua risposta stamperà una riga vuota per ogni record senza $ 2.

No, la mia risposta stampa un vuoto come. E immagina che il valore sia 0, non solo nullo?
cuonglm,

Immagino dato il contesto della domanda che non sarebbe un problema.

Grazie a tutti per le vostre risposte rapide ... È davvero utile per me. Molte grazie!
user79658

4

Poiché sono già state fornite soluzioni awke perl, volevo provare sed:

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

2

Puoi farlo in molti modi.

Con awk:

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

Con perl:

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

0

elaborazione dei numeri di input quotati

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

Cerca di essere un po 'più prolisso nella tua risposta
ddnomad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.