Linux 使用xargs,为文件中的每一行计算这些行在另一行中的出现次数

Linux 使用xargs,为文件中的每一行计算这些行在另一行中的出现次数,linux,bash,command,line,xargs,Linux,Bash,Command,Line,Xargs,这是我发现自己被困在linux(centos 7)学术模块中的一个问题。我有一个从日志文件中提取的IP文件。我已将IP排序到一个新文件中,删除重复项 手头的问题是,对于唯一IP文件中的每一行,搜索初始日志文件中每个IP出现的次数,并输出一个文件,其中每一行只是IP出现次数的计数(不包含实际IP-没有多大意义,但这是下一个问题) 新文件还应仅包含出现次数最多的10个数字 有人告诉我应该使用xargs,还请注意,这绝不适用于任何类型的测试/考试 非常感谢。非xargsoneliner: 读取时-r

这是我发现自己被困在linux(centos 7)学术模块中的一个问题。我有一个从日志文件中提取的IP文件。我已将IP排序到一个新文件中,删除重复项

手头的问题是,对于唯一IP文件中的每一行,搜索初始日志文件中每个IP出现的次数,并输出一个文件,其中每一行只是IP出现次数的计数(不包含实际IP-没有多大意义,但这是下一个问题)

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

有人告诉我应该使用xargs,还请注意,这绝不适用于任何类型的测试/考试


非常感谢。

非xargsoneliner:

读取时-r ip;do grep-Fwc“$ip”日志文件;完成
一种可能的
xargs
方法,使用它并行运行多个
grep
s(您也可以为此使用GNU
parallel
):

xargs-aips.txt-I'{}'-n1-P4 grep-Fwc'{}'日志文件| sort-rn | head-10

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

使用GNU并行,它将如下所示:

parallel -j0 --tag grep -wFc {} log < ips | sort -k2nr | head

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

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

awk'NR==FNR{a[$0]=0;next}

{for(i=1;i可能的想法是使用
xargs
并行运行多个grep?感谢您的反馈--忘记了一对括号。您需要一些sort+head来获得前10名。是的,或者可以在Awk中以及
END
块中轻松完成。
cat log | parallel --tee --pipe --tag grep -wFc {} :::: ips | sort -k2nr | head