
Ich versuche, den Zeitbereich aus einer Protokolldatei zu extrahieren, indem ich Shellvariablen übergebe awk
. So sieht meine Protokolldatei aus.
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 13:58:59.290 2.2.2.2 etc..
2014-11-24 14:58:59.290 3.3.3.3 etc ..
2014-11-24 12:58:59.290 4.4.4.4 etc..
2014-11-24 15:58:59.290 4.4.4.4 etc..
Angenommen, ich möchte einen Zeitbereich zwischen 12 und 13 Stunden extrahieren. Hier ist das Bash-Skript, das ich geschrieben habe.
stime=12
etime=13
date_=2014-11-24
awk 'BEGIN {
a='$stime';b='$etime';d='$date_'; FS="[: ]"
}
{
if ( $1 == d && $2 >= a && $2 < b )
print $1 $2 $3
}' logfile.txt
Meine Ausgabe sollte so aussehen.
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 12:58:59.290 4.4.4.4 etc..
Ich sehe weder eine Ausgabe noch Fehler. Ich weiß nicht, was schief läuft. Für jede Hilfe wäre ich dankbar. Danke
Antwort1
stime=12
etime=13
date=2014-11-24
awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
{
if ( $1 == d && $2+0 >= a && $2+0 < b )
print $1,$2,$3
}' logfile.txt
Das Ergebnis ist:
2014-11-24 12 58
2014-11-24 12 58
Anmerkungen:
FS="[: ];"
bewirkt, dass der Feldtrenner auf einen Doppelpunkt oder ein Leerzeichen gefolgt von einem Semikolon gesetzt wird. Diese Kombination kommt in der Eingabedatei nie vor.Im ursprünglichen Code
d='$date_';
ergab die Zuweisungd
den Wert1979
. Das liegt daran, dass der Ausdruck, wenn er in AWK-Code eingeführt wird,2014-11-24
als numerischer Ausdruck interpretiert wird, der eine Subtraktion erfordert.Es empfiehlt sich, Shell-Variablen mit dieser
-v
Option an awk zu übertragen. Sowohl die Shell als auch awk können korrekte Anführungszeichen erfordern, und mit dieser-v
Option können wir diese Anführungszeichenprobleme einzeln behandeln.awk kann je nach Kontext entweder numerische oder alphabetische Vergleiche durchführen. Durch das Hinzufügen
+0
des Codes stellen wir sicher, dass awk numerische Vergleiche durchführt.