2017-11-24 4 views
-3

Fortsetzung von meinem letzten Beitrag zu beschleunigen read line by line with awk and parse variablesawk Puffervariablen Parsen von Linien

I Ergebnis eines Feldes puffern wollen Parsen von Protokollzeilen zu beschleunigen.
Ich versuchte
awk 'BEGIN{OFS=","} { FS="\""; $0=$0; CIP=$4; (buffer[CIP]==0) { cmd="geoiplookup "CIP; cmd | getline buffer[CIP]; close(cmd) } ... print "CIP,..." >> mysql.infile }' $1

aber ich Syntaxfehler erhalten ...

CIP = [IP address]
Also so versuche ich, die IP-Adresse zu puffern (n), dass es nicht läuft geoiplookup Skript die ganze Zeit, wie es verlangsamt das Parsen nach unten ...

Jede Hilfe ist willkommen ...

+5

Es ist in Ordnung, auf vorherige Fragen zu verweisen, aber versuchen Sie, hier genügend Kontext einzubeziehen, damit diese Frage von sich aus beantwortbar ist. Im Moment ist nicht klar, was Sie zu tun versuchen. –

+0

Es ist eher eine Syntaxfehlerfrage, als was ich eigentlich versuche ... Jedenfalls bearbeite ich die Frage, um sie klarer zu machen. – vessel

+0

Haben Sie 'FS =" \ ""; $ 0 = $ 0; CIP = $ 4; 'nur in der Mitte des Skripts, nicht in einem Block' {} '? –

Antwort

1

ich habe keine direkten Probleme mit der Pufferung sehen, wie es in diesem Beispiel scheint zu funktionieren ::

echo "172.217.22.132\n172.217.22.132" | \ 
    awk '{CIP=$1} 
     (buffer[CIP]==0) { print "Calling geoiplookup"; 
     cmd="geoiplookup "CIP; 
     cmd | getline buffer[CIP]; 
     close(cmd) } 
     {print buffer[CIP]}' 

Dies erzeugt:

Calling geoiplookup 
GeoIP Country Edition: US, United States 
GeoIP Country Edition: US, United States 

Wie man sieht es nur einmal aufgerufen wird, so dass die Puffer funktioniert.

Es gibt jedoch einen Fehler in Ihrem Code, sollte das folgende besser funktionieren.

awk 'BEGIN{OFS=","} 
{ FS="\""; $0=$0; CIP=$4; } 
(buffer[CIP]==0) { cmd="geoiplookup "CIP; cmd | getline buffer[CIP]; close(cmd) } 
... 
{print "CIP,..." >> mysql.infile }' $1 

denke ich, das Hauptproblem ist hier das Verständnis der awk Syntax.

In seiner einfachen Form sollten Sie awk als line oder record Parser verstehen. Die awk Sprache ist aus einer Reihe von Regeln der Form bauen

pattern1 { action1 } 
pattern2 { action2 } 
... 

die als interpretiert werden soll: wenn pattern1 zufrieden ist, führen action 1 auf der aktuellen Zeile. dann weiter zu pattern2. Wenn kein Muster angegeben wird, wird davon ausgegangen, dass es true ist und die entsprechende Aktion ausgeführt wird.

Im ersten Beispiel oben gibt es 3 Regeln.

  • {CIP=$1} besagt, dass als eine erste Maßnahme die Variable CIP zu setzen $1
  • (buffer[CIP]==0) { print ... } besagt, dass die zweite Aktion (print ...) nur dann durchgeführt wird, wenn buffer[CIP] Null ist, das heißt der Wert noch nicht berechnet.
  • Der letzte Regelstatus gibt den gepufferten Wert aus.

Ich hoffe, das hat geholfen.

Verwandte Themen