Как использовать awk для печати, если значение столбца имеет четное число

Как использовать awk для печати, если значение столбца имеет четное число

У меня есть файл журнала доступа с разными номерами портов в столбце 2. Я хочу перечислить весь трафик, который прошел через четные порты. Как это сделать?

решение1

Я не эксперт в awk, но вот простой пример использования оператора модуля:

echo "foo bar 2
bar foo 3
foobar barfoo 4" | awk '($3 %2 == 0)'
foo bar 2
foobar barfoo 4

Только те строки, где $3естьдаженапечатано.

решение2

если ваш файл журнала выглядит так:

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"

то вы можете распечатать полную строку сообщения журнала, которая имеет четный номер порта, используя следующую команду:

while read line; do if [ $((`echo "$line"|awk '{ print $2 }'` % 2)) -eq 0 ]; then echo "$line"; fi ; done < "logfile"

что даст такой вывод:

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"

ИЛИ

если вы хотите напечатать только номер порта, то вы можете сделать так:

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

Примечание:Я предполагаю, что в вашем файле журнала нет пустых строк.

решение3

В зависимости от используемого формата файла (разделитель — пробел, запятая, вертикальная черта и т. д.):

cat <filename> | awk -F"<delimiter>" '{if ($<column number> %2 == 0){print $0}}'

Образец файла, который я создал, представлен ниже:

/ : server1> cat test1
a 2
b 1
c 5
d 6
e 9
f 8

Я выполню запрос, как показано ниже, чтобы получить желаемый результат:

/ : server1> cat test1 | awk -F" " '{if ($2 %2 == 0){print $0}}'
a 2
d 6
f 8

Связанный контент