计算每个IP地址出现在日志文件中的次数


9

我有一个格式如下的文件:

$ cat file.txt

27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1

将文件解析file.txt为以下格式的最佳方法是:

27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3

换句话说,我想遍历文件并计算每个IP地址出现的次数。我已经运行了它,sort因此所有IP地址都井井有条,彼此紧紧相连。


我个人将这种文件导入附近的一个方便的数据库中(通过在我遇到的任何postgres实例中创建一个临时表),然后执行快速的SQL操作并导出回文本文件。
奥卡德2014年

Answers:


23

您正在寻找 uniq -c

如果该输出不符合您的喜好,则可以对其进行解析和重新格式化。

例如:

$ uniq -c logfile.txt | awk '{print $2": "$1}'
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3

结合uniqawk不会似乎是一个伟大的方式给我...
Hauke Laging

3
因为uniq仅适用于排序的输入(它匹配相邻的匹配行,而不匹配文件中的任何行)。
奥卡德2014年

1
您必须先对结果进行排序,然后再将它们传递给uniq。如果您阅读了原始Q,则OP表示他已经使用sort!对结果进行了排序。
slm

2
@HaukeLaging-我很欣赏您的意思,但是就像大多数计算机用户永远不会冒险使用OSX和Windows一样,此外,大多数Unix用户也不会冒险使用指定工具来完成特定任务。使用AWK并不是出于胆小,请查看使用AWK执行此基本任务所要做的工作以及Glenn的解决方案所需要的。我认为我的说法很公平,尽管您的方法可能更有效,但他是一个更容易解决的方法。顺便说一句,我都做了紫外线,因为它们都是正确的!
slm

1
@HaukeLaging-是的,完全正确。IMO,当您在站点周围闲逛时,我们的职责会稍有变化。我们负责制作全面的A'ers,并在为OP及其附近的每个未来访问者(也是IMO)提供教学时间时,对我们提供的A'er进行检查。但这是个人选择,因此,如果您只有几分钟的空闲时间,那么总是希望以任何形式提供A。
slm

6

uniq确实,这似乎是一个更明智的解决方案。awk方式:

awk '{ip_count[$0]++}; '\
'END {for (ip in ip_count) printf "%15s: %d\n",ip,ip_count[ip];}' file

+1。如果输出的顺序对OP很重要,则此答案不能保证:遍历关联数组的键没有固有顺序。
格伦·杰克曼(Glenn Jackman)2014年

@glennjackman但是添加sort到我的答案仍然更快,因为必须排序的项目更少。;-)
Hauke Laging

哦耶?哦耶?!?;)输入已经排序。这个awk的答案使它们混乱,因此还有更多工作要做。Nyah!;)
格伦·杰克曼(Glenn jackman


0

我会使用python。如今,每个Linux系统都安装了python2。

将每个IP地址作为键=值对添加到dict(关联数组)中,即{“ 12.34.56.78”:1,“ 87.76.43.21”:3}。

您可以将IP地址“验证”为密钥,并将值增加1。如果使用defaultdict(“ ip”),则如果密钥不存在,则会使用默认值0创建该密钥。已经,defaultdict什么也不做。该值在下一行增加。

#!/usr/bin/python2

infile = open("file.txt","r")
iplist = {}  # create an empty dict

for line in infile:
    line = line.strip()   # remove newline.
    if line: # if not a blank line.
        iplist.setdefault(line, 0) # check for ip and add with default value of 0
        iplist[line] += 1 # increment

outfile = open("out.txt","w") #open output file

for key in iplist.keys():
    line = "%-15s = %s" % (key, iplist[key])
    print line   # print uf desired.
    outfile.write(line + "\n")

输出文件:

cat out.txt                                                          
27.33.65.2      = 2
58.161.137.7    = 1
121.50.198.5    = 1
184.173.187.1   = 3

我知道您在寻找命令行解决方案,但是正如您所看到的,它是一种格式精美的显示器,仅占用了十几行。Python是出色的管理工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.