使用grep命令如何打印出唯一匹配项的数量?

30

假设我有数百万个数据包要检查,并且我想知道每个数据包发送到某个端口号的次数。

以下是其中一些数据包:

10:27:46.227407 IP 85.130.236.26.54156 > 139.91.133.120.60679: tcp 0
10:27:46.337038 IP 211.142.173.14.80 > 139.91.138.125.56163: tcp 0
10:27:46.511241 IP 211.49.224.217.3389 > 139.91.131.47.6973: tcp 0

我想要在这里查看第二个端口号:

60679、53163、6973等

所以我可以使用:

grep -c '\.80:' output.txt

如何统计在文件中使用了多少次端口号80。但是否有一种方法可以显示使用过的所有端口和它们在该文件中出现的次数。最好能够按照使用频率排序以便查看最常用的端口:

.80: - 54513
.110: - 12334
.445: - 412
1个回答

55

查看uniq -c。您需要提取所需内容、对结果排序、通过uniq管道去重,然后再次排序输出。像这样的:

egrep '\.[0-9]+:' output.txt | sort | uniq -c | sort -nr

澄清一下:我在这里使用grep,因为不清楚你的output.txt格式是什么样的,但你会想要通过cut或者awk去掉端口号部分。

编辑:如果要获取端口号,可以先按句点切割一次,然后再按冒号切割一次:

cut -d. -f10 < output.txt | cut -d: -f1

(或使用其他几种方法之一来完成相同的事情。) 这将为您提供一个未排序的端口列表。 然后:

cut -d. -f10 < output.txt | cut -d: -f1 | sort | uniq -c | sort -nr

谢谢你的帮助。但是我在使用cut命令时遇到了问题。有没有一种只使用正则表达式来进行切割的方法?因为端口号并不总是在同一列和间隔中。 - Dragonfly
Cut 不使用正则表达式。请编辑您的问题并添加一些示例行,以便我们查看格式。 - Alex Howansky
好的,我编辑了一些示例。那么你会推荐我使用什么? - Dragonfly
非常帮忙!我真的很感激。 - Dragonfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接