回答:
-m 1
任意のファイルで最初に一致したものを返すことを意味します。ただし、他のファイルは引き続き検索されます。また、同じ行に2つ以上一致するものがある場合、それらすべてが表示されます。
head -1
この問題を解決するために使用できます。grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1
-o, --only-matching, print only the matched part of the line (instead of the entire line)
-a, --text, process a binary file as if it were text
-m 1, --max-count, stop reading a file after 1 matching line
-h, --no-filename, suppress the prefixing of file names on output
-r, --recursive, read all files under a directory recursively
-r
明らかな場合を除いて)、害がないはずです(私は使用しません-a
)
grep -m 1
、このため両方のインスタンスが返されました。|head -1
解決しました!
first not first from result
。この回答は、すべてのファイルで最初の一致を出力して停止します。他に何を期待しましたか?
grep
結果をstdbufhead
と組み合わせてパイプすることができます。
N番目の一致後に確実に停止するために、出力をバッファリングしないstdbuf
ようにするためにを使用する必要があることに注意grep
してください。
stdbuf -oL grep -rl 'pattern' * | head -n1
stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1
stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1
head
1行を消費するとすぐに終了し、なくなったときにまだパイプに何かを出力しているのでgrep
受信します。SIGPIPE
head
これは、ファイル名に改行が含まれていないことを前提としています。
xargs
次のように検索しようとしていますfind . -name '*.gz' | xargs -I '{}' stdbuf -oL zgrep -al 'pattern' {} | head -n 1
。ただし、これは最初の一致で終了しません。何かアドバイス?
grep
の--line-buffered
オプションは、追加のユーティリティを呼び出さずにバッファのオーバーヘッドを防止しないのですか?
私のgrep-a-likeプログラムにack
は、-1
どこかで見つかった最初の一致で停止するオプションがあります。-m 1
@mvpが参照するものもサポートします。ソースコードの大きなツリーを検索して、1つのファイルだけに存在することがわかっているものを見つける場合、それを見つける必要はなく、Ctrl-Cを押す必要があるので、そこに入れました。
ag
速いかもしれないが、それはありません持っている-1
。この場合に有用であるオプション
シングルライナー、以下を使用find
:
find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit
grep -r
はるかに速く動作します-ディレクトリトラバーサルを行う唯一のコピーです。