Ich habe eine Zugriffsprotokolldatei mit verschiedenen Portnummern in Spalte 2. Ich möchte den gesamten Datenverkehr auflisten, der über Ports mit geraden Nummern lief. Wie mache ich das?
Antwort1
Kein Experte in awk
, aber hier ist ein einfaches Beispiel für die Verwendung des Modulo-Operators:
echo "foo bar 2
bar foo 3
foobar barfoo 4" | awk '($3 %2 == 0)'
foo bar 2
foobar barfoo 4
Nur die Zeilen, in denen $3
istsogarwird gedruckt.
Antwort2
wenn Ihre Protokolldatei wie folgt aussieht:
cat logfile
192.168.1.102 81 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"
192.168.1.102 2323 [15/Aug/2016:10:54:32 +0530] "some message"
Anschließend können Sie mit dem folgenden Befehl die vollständige Zeile der Protokollmeldung ausdrucken, einschließlich der Portnummer:
while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"
Das Ergebnis ist wie folgt:
while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"
192.168.1.101 8888 [15/Aug/2016:10:52:32 +0530] "some message"
192.168.1.103 80 [15/Aug/2016:10:53:33 +0530] "some message"
ODER
wenn Sie nur die Portnummer drucken möchten, können Sie Folgendes tun:
for i in `cat logfile | awk '{ print $2 }'`; do if [ $(($i % 2)) -eq 0 ]; then echo "Port number: $i"; fi ; done
Port number: 8888
Port number: 80
Notiz:ich gehe davon aus, dass Ihre Protokolldatei keine Leerzeile enthält.
Antwort3
Abhängig vom verwendeten Dateiformat (Trennzeichen Leerzeichen, Komma, Pipe usw.):
cat <filename> | awk -F"<delimiter>" '{if ($<column number> %2 == 0){print $0}}'
Beispieldatei, die ich wie folgt erstellt habe:
/ : server1> cat test1
a 2
b 1
c 5
d 6
e 9
f 8
Ich werde die Abfrage wie folgt durchführen, um die gewünschte Ausgabe zu erhalten:
/ : server1> cat test1 | awk -F" " '{if ($2 %2 == 0){print $0}}'
a 2
d 6
f 8