我有一个访问日志文件,其第 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