如何在文件中搜索一组模式,然后返回它们所在行的数量?

时间:2015-07-23 03:14:18

标签: bash logging grep

我有一个大型syslog文件(几千兆字节),其中包含大约1800个设备的日志。

离。

timestamp device1 devicelog
timestamp device2 devicelog
timestamp device3 devicelog
timestamp device1 devicelog
timestamp device1 devicelog
timestamp device2 devicelog

如何浏览日志文件并返回每个设备所在的所有行号?例如,我将得到以下输出:

device1: 1,4,5
device2: 2,6
device3: 3

我想到的一个想法是grep -c记录每个设备名称的日志文件,但是这会花费一些时间来记录日志文件的大小以及我要搜索的设备数量。我简要地想过在每次grep之后删除设备的匹配行,但是我不想编辑日志文件,也没有在服务器上有太多额外的空间来制作文件的副本。

有更快的方法吗? Awk浮现在脑海中,但我还不太精明,所以我不确定是否可以将它用于此目的。

1 个答案:

答案 0 :(得分:2)

考虑:

$ awk '{a[$2]=(a[$2]?a[$2]",":"")NR;} END{for (dev in a)print dev,a[dev];}' file
device1 1,4,5
device2 2,6
device3 3

如何运作

  • a[$2]=(a[$2]?a[$2]",":"")NR

    对于文件中的每一行,我们会在设备名称NR的键下将数字a添加到数组$2

    在添加NR之前,我们会检查a[$2]中是否存在一个或多个号码。如果有,请在添加NR之前添加逗号。

  • END{for (dev in a)print dev,a[dev];}

    当我们到达文件末尾时,我们会打印出数组a的内容。