So verwenden Sie awk zum Drucken, wenn ein Spaltenwert eine gerade Zahl hat

So verwenden Sie awk zum Drucken, wenn ein Spaltenwert eine gerade Zahl hat

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 $3istsogarwird 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

verwandte Informationen