使用PV的Grep进度栏(管道查看器)


11

我的计算机上有一个巨大的目录,我需要在其中的每个ruby文件中搜索一个字符串。

我本可以这样完成的:grep -R "string" *.rb但是要花很长时间,我想使用pv(管道查看器)显示进度条以能够监视grep进度。

但是我真的不知道如何编写此命令,因为对于该命令我仍然有些不了解。

有人知道吗?

Answers:


15

pv管道上运行(不是命令)-这是一种体积计,显示有多少数据经过管道中的给定点。
您的grep命令不是管道(|- pipe operator找不到位置)-它只是一个命令来执行任务。 pv在这里不能为您提供帮助,您只需要相信grep在所有输入文件上实际上正在执行此操作即可。

可以凑齐与发现,PV,xargs的grep的和(共同的东西find . -name "*.rb" | pv | xargs grep [regex]看起来像它可能是有前途的,但你必须告诉pv该有多大find的输出是它给有意义的结果。

坦白说,这似乎是值得的工作。只需运行您的grep,耐心等待,然后在完成后处理输出即可。


1
这绝对是可能的,它只是令人费解,与等待grep完成相比,可能需要更长的时间才能组合起来并开始工作:-)
voretaq7 2011年

1
可能是一个非常好的片段:p
Cydonia7 2011年

4

另外两种方法:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

或者,在运行原始命令的其他外壳中,找到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,而不是ls*.rb作为thinice建议。


1
这是一个不错的选择
Cydonia7 2011年

1

我不确定您使用的是哪种操作系统,但grep -R "string" *.ext可能无法正常使用。

find结合使用,可能会更好grep

find . -type f -name "*.rb" -print0 |xargs --null grep "string"


是的,我给出的命令实际上在Fedora 16上有效,但是您的命令更清晰了。谢谢 !
Cydonia

1

在最新版本的中,pv有一个"-d"-Option来监视另一个进程的所有FD。

因此,从理论上讲,pv它不仅可以充当管道,而且可以作为整个过程的进度指示器。(例如,使用Firefox的PID尝试一下)

对于上面的问题,以下是一个更简单的想法:grep运行时,lsof与一起使用watch

$ watch -n 1 "lsof | grep -n $PWD"

这样,您可以监视grep的进度。


0

你已经尝试过了吗

grep -R "string" *.rb | pv

我不知道它是否真的有效,因为它不知道要递归搜索多少总数据?


4
我不认为这会做他想做的- pv将在grep的输出操作(所以即使他指定的整个输入大小pv只能看到输出出来的管道的末端-这将是方式下计数字节
voretaq7 2011年

0

我通常在Linux系统上使用proc-filesystem,即

ls -al /proc/<pid of grep>/fd

这列出了grep调用当前已打开的所有文件,从而给人以当前搜索位置的印象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.