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.
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. –
Es ist eher eine Syntaxfehlerfrage, als was ich eigentlich versuche ... Jedenfalls bearbeite ich die Frage, um sie klarer zu machen. – vessel
Haben Sie 'FS =" \ ""; $ 0 = $ 0; CIP = $ 4; 'nur in der Mitte des Skripts, nicht in einem Block' {} '? –