如何从超过3行显示特定单词的文件夹中找到文件?我尝试使用递归grep来查找该单词,然后使用-c来计算单词出现的行数。
答案 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)
而不是默认(空格和制表符)分隔字段。这个解决方案很好地概括了任何数字。
同样,如果匹配计数无关紧要,您只想获取文件名列表,请改为:
: