N番目のファイルが一致した後にgrepを停止する

N番目のファイルが一致した後にgrepを停止する

特定の文字列を検索する必要があるファイルがたくさんあります。grep -rl 'pattern' *パターンを含むファイルを検索するために使用します。しかし、私はファイルの数だけに興味があります。文字列がN個以上のファイルに表示される場合は、N番目の一致に達するとすぐにgrepを停止したいと思います(全体のファイル階層を検索するのは長い作業です)。意味のある終了コードを返したらいいのに、これができない場合は問題なくパイプで接続できますwc

N番目のファイルを一致させた後、grepに他のファイル検索を停止するように指示するにはどうすればよいですか?

答え1

grep結果をhead

N番目の一致後に停止するには、次のように出力をバッファリングしないようにする必要がstdbufあります。grep

stdbuf -oL grep -rl 'pattern' * | head -n10

head10行が消費されると消えても、まだパイプに何かを出力するgrepため、終了して受信されます。SIGPIPEhead

これは、ファイル名に改行文字が含まれていないと仮定します。

答え2

これはまさにあなたが要求するものではありませんが、使用されるファイルの数を考慮すると、ファイルサイズなどによってスクリプト時間が異なる可能性があるため、これはあなたのニーズに適していると思います。制限する方法を確認してください。処理時間、あなたはできます

timeout -k 1m grep -rl 'pattern' *

スクリプトをすばやく実行するために処理されたファイルの数を計算するのではなく、指定された時間が経過した後に実際にコマンドを閉じます。私のコード例では1分ですが、1mを正しい対応するサフィックスに置き換えると、秒(s)時(h)または日(d)に変更できます。たとえば、1時間実行してみましょう。

timeout -k 1h grep -rl 'pattern' *

これが他の人に役立つことを願っています!

答え3

puregrepではありませんが、次のことがありますbash

i=0
grep -rl 'pattern' * | while read l ; do
  i=$(($i+1))
  echo $l
  if [ $i -ge N ] ; then 
    echo "at least N matches"
    break
  fi
done

一致するファイルの数が一致するしきい値をはるかに超えると、速度が速くなりますN

関連情報