这是一个linux (centos 7)学术模块中的一个问题,我发现自己一直在使用这个模块。我有一个IP文件,从日志文件中提取出来。我已经将IP整理到一个新文件中,去掉了重复的内容。
现在的问题是,对于唯一IP的文件中的每一行,搜索初始日志文件,了解每个IP出现的次数,并输出一个文件,其中每行都是IP出现次数的简单计数(不包含实际的IP-没有太多意义,但这是下一个问题的内容)。
新文件还应该只包含出现次数最多的10个数字。
我被告知我应该使用xargs,还请注意,这绝不是任何类型的测试/考试。
非常感谢。
发布于 2020-11-09 19:01:39
使用xargs来做这件事似乎是误导和低效的。使用Awk,您可以只遍历日志文件一次。
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.logAwk惯用法NR == FNR { ...; next }允许您将第一个文件读取到内存中,这样您就可以根据内存中的结构检查后续文件。
我们将每个IP地址作为键读取到关联数组a中;然后在后续文件中,我们遍历行上的每个单词,并检查它是否是a中的键之一;如果是,则递增关联数组中的计数。
发布于 2020-11-09 04:19:41
Non-xargs oneliner:
while read -r ip; do grep -Fwc "$ip" logfile; done < ips.txt | sort -rn | head -10一种可能的xargs方法,使用它并行运行几个grep(您也可以使用GNU ):
xargs -a ips.txt -I'{}' -n1 -P4 grep -Fwc '{}' logfile | sort -rn | head -10这将从ips.txt中读取行,而不是标准输入,并一次启动最多4个grep副本,每个副本都有一个输入行,用作该grep的单词来统计匹配项。
发布于 2020-11-09 18:54:33
对于GNU并行,它看起来像这样:
parallel -j0 --tag grep -wFc {} log < ips | sort -k2nr | head如果log很大,你会想要一次又一次地无效读取它,为此,你可以使用--tee,只要你可以在每个IP上运行一个进程:
cat log | parallel --tee --pipe --tag grep -wFc {} :::: ips | sort -k2nr | head该解决方案使用GNU并行,因此如果不允许使用perl程序,则不能使用该解决方案。因此,此答案主要是为没有该限制的其他人提供参考。
https://stackoverflow.com/questions/64742391
复制相似问题