当特定单词出现在至少特定行数时,从文件夹中查找文件

时间:2015-08-27 11:37:01

标签: linux unix command-line

如何从超过3行显示特定单词的文件夹中找到文件?我尝试使用递归grep来查找该单词,然后使用-c来计算单词出现的行数。

1 个答案:

答案 0 :(得分:0)

此命令将以递归方式列出当前目录中出现word超过3行的文件,以及每个文件的匹配计数:

grep -c -r 'word' . | grep -v -e ':[0123]$' | sort -n -t: -k2

如果您不希望对结果进行排序,则无需进行最终排序,但我认为这很方便。

管道中的第一个命令(grep -c -r 'word' .)以递归方式查找当前目录中包含word的每个文件,并计算每个文件的出现次数。中间grep会丢弃每个0,1,2或3的计数,因此您只需获得大于3的计数(这是因为-v中的grep(1)会将匹配感反转为选择不匹配的线)。最后的排序步骤根据每个文件的出现次数对列表进行排序;它将字段分隔符设置为:,并指示sort(1)使用第二个字段(计数)作为排序键进行基于数字的排序。

以下是我运行的一些测试的示例输出:

./file1:4
./dir1/dir2/file3:5
./dir1/file2:8

如果您只想要没有匹配计数的文件名,可以使用sed(1)放弃:count部分:

grep -m 4 -c -r 'word' . | grep -v -e ':[0123]$' | sed -r 's/:[0-9]+$//'

如评论中所述,如果匹配计数不重要,在这种情况下,我们可以使用grep优化第一个-m 4,这会在4个匹配行后停止读取文件。

<强>更新

如果使用较小的数字,上述解决方案可以在一定程度上正常工作,但对于较大的数字,它不能很好地扩展。如果你想根据一个任意数字进行过滤,你可以使用awk(1)(事实上它最终会变得更干净),如下所示:

grep -c -r 'word' . | awk -F: '$2 > 10'

-F:的{​​{1}}参数是必要的;它指示awk(1)awk(1)而不是默认(空格和制表符)分隔字段。这个解决方案很好地概括了任何数字。

同样,如果匹配计数无关紧要,您只想获取文件名列表,请改为:

: