Wert zwischen doppelten Anführungszeichen extrahieren

16

Meine Frage ist, den Wert zwischen doppelten Anführungszeichen zu extrahieren "". Beispieleingabe ist:

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 "

Ich habe große Protokolldateien, daher können die Werte für jede Zeile unterschiedlich sein. Der Wert muss zwischen dem ersten Auftreten von doppelten Anführungszeichen extrahiert werden.

Erwartete Ausgabe:

GET /balancer-manager HTTP/1.1

Hat jemand eine Idee dann bitte vorschlagen.

user79658
quelle

Antworten:

27

Sie können nur dafür verwenden cut:

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

-d '"'Sagt cut, dass ein doppeltes Anführungszeichen als Feldbegrenzer verwendet werden soll. -f2weist es an, das zweite Feld zwischen dem ersten und dem zweiten Anführungszeichen zu nehmen - oder die erste Zeichenfolge in Anführungszeichen, genau das, was Sie wollen.

Michael Homer
quelle
Wie drucke ich alle gerade nummerierten Spalten im Schnitt einfach aus %!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

Ein Weg mit awk

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

Wenn aus irgendeinem absurden Grund Ihre HTTP-Methoden tatsächlich sind 0und Sie diese ausgeben möchten

awk -F'"' '{$0=$2}1' file
phk
quelle
Was ist, wenn $2null ist?
4.
Dann wird es nicht gedruckt? Das gleiche, wie es in deiner Antwort nicht der Fall ist. Der einzige Unterschied ist, dass Ihre Antwort für jeden Datensatz eine leere Zeile ohne $ 2 ausgibt.
Nein, meine Antwort ist leer. Und stell dir vor, der Wert ist 0nicht nur null?
Cuonglm
Ich könnte mir vorstellen, angesichts des Zusammenhangs der Frage, dass dies kein Problem sein würde.
Vielen Dank für Ihre schnellen Antworten ... Es ist wirklich hilfreich für mich. Danke vielmals!
User79658
4

Da eine awkund perlLösungen bereits vorhanden sind, wollte ich versuchen sed:

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

Sie können es auf viele Arten tun.

Mit awk:

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

Mit perl:

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

Verarbeitung von Eingabenummern

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
Ein Mann
quelle
Versuchen Sie, in Ihrer Antwort etwas ausführlicher zu sein
ddnomad