![使用 pv (管道查看器) Grep 进度条](https://linux22.com/image/570725/%E4%BD%BF%E7%94%A8%20pv%20(%E7%AE%A1%E9%81%93%E6%9F%A5%E7%9C%8B%E5%99%A8)%20Grep%20%E8%BF%9B%E5%BA%A6%E6%9D%A1.png)
我的计算机上有一个巨大的目录,我需要在里面的每个 ruby 文件中搜索字符串。
我可以这样做:grep -R "string" *.rb
但这需要很长时间,而且我想使用 pv(管道查看器)来显示进度条以便能够监控grep
进度。
但我真的不知道如何写这个命令,因为关于这个命令还有一些我无法理解的事情。
有人知道吗?
答案1
pv
适用于管道(不是命令)——它是一个容量计,显示有多少数据已经通过管道中的给定点。
您的 grep 命令是不是管道(|
-pipe operator
无处可寻) - 它只是一个命令在做它的事情。 pv
这里无法帮助你,你只需要相信它grep
实际上在所有输入文件上执行它的事情。
你可以用 find、pv、xargs 和 grep 拼凑一些东西(find . -name "*.rb" | pv | xargs grep [regex]
看起来很有希望,但是你必须知道输出pv
有多大find
才能给出有意义的结果。
坦白说,这似乎比它本身的价值要多得多。只需运行 grep,耐心地等待,并在完成后处理输出。
答案2
另外两种方法:
for file in *.rb; do echo $file; grep "string" $file >> output.txt; done
或者,在原始命令正在运行时在另一个 shell 中,找到 grep 命令的 pid,然后:
strace -q -s 256 -e trace=open -p [pid] 2>&1 | head
以上两个命令都会显示 grep 命令当前正在处理的文件。你可以使用以下命令查找文件总数:
ls -l *.rb | wc -l
最后,使用它来确定当前文件在列表中的编号:
ls -l *.rb | grep -n [the current filename]
PS 我的回答假设您的所有文件都在一个目录中。如果不是,则必须使用find
而不是,正如thinice建议的那样ls
。*.rb
答案3
我不确定您使用的是什么操作系统,但grep -R "string" *.ext
可能无法正常工作。
find
结合使用可能会更好grep
:
find . -type f -name "*.rb" -print0 |xargs --null grep "string"
答案4
你已经尝试过吗
grep -R "string" *.rb | pv
我不知道它是否真的有效,因为它不知道要搜索总共多少位数据,因为它是递归的?