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.


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.


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

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

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

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

Versuchen Sie, in Ihrer Antwort etwas ausführlicher zu sein
ddnomad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.