pv(パイプビューア)を使用したGrepプログレスバー


11

コンピューターに巨大なディレクトリがあり、内部のすべてのルビファイルで文字列を検索する必要があります。

私はこのようにそれをすることができた:grep -R "string" *.rbしかしそれは本当に時間がかかり、進行状況を監視できるように進行状況バーを表示するためにpv(パイプビューア)を使用したいと思いgrepます。

しかし、このコマンドについて理解できないことがまだあるので、このコマンドをどのように書くことができるのか本当にわかりません。

誰かが何か考えを持っていますか?

回答:


15

pvパイプで動作します(コマンドではありません)-パイプラインの特定のポイントを通過したデータ量を示すボリュームゲージです。
あなたのgrepコマンドはパイプラインではありません|- pipe operatorどこにも見つかりません)-それはただ1つのコマンドで実行されます。 pvここであなたを助けることはできません、あなたgrepはそれが実際にすべての入力ファイルでそのことをしていることを信頼しなければなりません。

find、pv、xargs&grep(それは有望に思えるかもしれませんが、意味のある結果を得るには、出力の大きさを通知する必要があります)と一緒に何かを考え出すことができます。find . -name "*.rb" | pv | xargs grep [regex]pvfind

率直に言って、それは価値があるよりも多くの仕事のようです。単にgrepを実行し、辛抱強く待って、完了したら出力を処理してください。


1
それは間違いなく可能です。複雑なだけで、grepが完了するのを待つよりも、まとめて作業するのにおそらく時間がかかります:-)
voretaq7

1
本当に素晴らしいスニペットである可能性があります:p
Cydonia7

4

さらに2つの方法:

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私の回答では、すべてのファイルが1つのディレクトリにあると想定しています。そうでない場合は、find代わりにls*.rbthinice が示すように使用する必要があります。


1
それは素晴らしい代替案です
Cydonia7 '12 / 12/21

1

お使いのOSはわかりませんが、grep -R "string" *.ext正常に動作していない可能性があります。

findと組み合わせて使用する方がよいでしょうgrep

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


ええ、私が与えたコマンドは実際にはFedora 16で機能しますが、あなたのコマンドはより明確です。ありがとうございました !
Cydonia7

1

最近のバージョンでpvは、"-d"別のプロセスのすべての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 '12 / 12/21

0

私は通常、Linuxシステムでproc-filesystemを使用します。

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

これにより、grep呼び出しが現在開いているすべてのファイルがリストされ、検索の現在の場所がわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.