如何使用 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

相关内容