我最近读过如何使用 find 命令查找文本和文件出现的总数,它询问了一种查找文本“abc”在文件中出现的次数的方法。那里的答案提供了find . -name "*.txt" | xargs grep -i "abc" | wc -l
查找计数的命令。
以前,我使用过类似的方法more "file_name*" |grep "abc" |wc -l
来列出特定文件中出现文本“abc”的次数。
我尝试了这个,发现该more
命令返回速度更快,但似乎比该命令使用了大约 30% 的 CPU(我也通过 进行监控top
)find
。
我想知道如果您要查询大约 15 个文件,是否有人有一些更可靠的数据来说明这两个命令中哪一个对资源的消耗更大? 30+ 个文件怎么样?
答案1
如果您有需要 grep 的文件列表,则不需要more
(或):只需将文件作为参数提供(无需通过第二个工具传输数据):cat
grep
grep -i abc *.txt | wc -l
主要区别在于,它find
不仅会列出当前目录中的文件(作为 的 shell 扩展*.txt
),而且还会递归到子目录中:
find . -name "*.txt" | xargs grep -i abc | wc -l
在第二种情况下,如果子目录中有一些*.txt
文件,这些文件也会作为grep
命令的参数提供。
顺便说一下,grep
有一个-c
选项可以计算出现次数(两者都不需要wc
)
grep -c -i abc *txt
它还只会给出每个文件出现的次数,而不是总数
答案2
我没有“可靠的数据”,但请考虑一下。
more
是一种(原始)过滤器,用于一次一屏地对文本进行分页。它的目的是交互地使用“用于 CRT 观看”。因此,即使您将输出发送到 a pipe
,它仍然使用内存和 CPU 资源通过more
提供的过滤功能向您显示每个文件。
cat
在您的示例中使用而不是更正确more
。更进一步,通过删除过滤程序的额外步骤并grep
直接搜索文件(而不是通过管道将输出传递给它),可以使示例命令更加高效。
由于find
命令速度较慢,find
因此还遍历从以下位置开始的目录结构,.
而more
仅对当前工作目录中的“file_name*”起作用。
答案3
乍一看,它只是尝试无用地使用 cat 奖励,但如果我们在调用 grep 之前对所有文件进行 cat 处理:
cat *.txt | grep -ci abc
grep 为你计算总和。既然您喜欢遍历子目录(您喜欢,不是吗?),您也可以在那里执行此操作:
find -name "*.txt" -exec cat {} + | grep -ci abc