首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xargs,对于文件中的每一行,计算这些行出现的次数

问使用xargs,对于文件中的每一行,计算这些行出现的次数
EN

Stack Overflow用户
提问于 2020-11-09 03:53:21
回答 3查看 275关注 0票数 1

这是一个linux (centos 7)学术模块中的一个问题,我发现自己一直在使用这个模块。我有一个IP文件,从日志文件中提取出来。我已经将IP整理到一个新文件中,去掉了重复的内容。

现在的问题是,对于唯一IP的文件中的每一行,搜索初始日志文件,了解每个IP出现的次数,并输出一个文件,其中每行都是IP出现次数的简单计数(不包含实际的IP-没有太多意义,但这是下一个问题的内容)。

新文件还应该只包含出现次数最多的10个数字。

我被告知我应该使用xargs,还请注意,这绝不是任何类型的测试/考试。

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2020-11-09 19:01:39

使用xargs来做这件事似乎是误导和低效的。使用Awk,您可以只遍历日志文件一次。

代码语言:javascript
复制
awk 'NR == FNR { a[$0] = 0; next }
{ for (i=1; i<=NF; ++i) if ($i in a) a[$i]++ }
END { for(k in a) if (a[k]) print a[k], k }' iplist.txt logfile.log

Awk惯用法NR == FNR { ...; next }允许您将第一个文件读取到内存中,这样您就可以根据内存中的结构检查后续文件。

我们将每个IP地址作为键读取到关联数组a中;然后在后续文件中,我们遍历行上的每个单词,并检查它是否是a中的键之一;如果是,则递增关联数组中的计数。

票数 1
EN

Stack Overflow用户

发布于 2020-11-09 04:19:41

Non-xargs oneliner:

代码语言:javascript
复制
while read -r ip; do grep -Fwc "$ip" logfile; done < ips.txt | sort -rn | head -10

一种可能的xargs方法,使用它并行运行几个grep(您也可以使用GNU ):

代码语言:javascript
复制
xargs -a ips.txt -I'{}' -n1 -P4 grep -Fwc '{}' logfile | sort -rn | head -10

这将从ips.txt中读取行,而不是标准输入,并一次启动最多4个grep副本,每个副本都有一个输入行,用作该grep的单词来统计匹配项。

票数 0
EN

Stack Overflow用户

发布于 2020-11-09 18:54:33

对于GNU并行,它看起来像这样:

代码语言:javascript
复制
parallel -j0 --tag grep -wFc {} log < ips | sort -k2nr | head

如果log很大,你会想要一次又一次地无效读取它,为此,你可以使用--tee,只要你可以在每个IP上运行一个进程:

代码语言:javascript
复制
cat log | parallel --tee --pipe --tag grep -wFc {} :::: ips | sort -k2nr | head

该解决方案使用GNU并行,因此如果不允许使用perl程序,则不能使用该解决方案。因此,此答案主要是为没有该限制的其他人提供参考。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64742391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档