web-dev-qa-db-ja.com

最初の試着だけを迎えて止まる

私は最初のマッチだけを返すことを望んで以下の引数でgrepを使ってディレクトリを再帰的に検索しています。残念なことに、それは2つ以上を返します - 実際に私が最後に見たときには2つです。特に望ましい結果が得られないと、私はあまりにも多くの議論をしているようです。 : - /

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory

以下を返します。

Pulsanti Operietur
Pulsanti Operietur

たぶんgrepはこれをするための最良の方法ではないでしょうか?ありがとうございます。

249
Tim Kamm

-m 1は、与えられたファイルの最初の一致を返すことを意味します。しかし、それでも他のファイルを検索し続けるでしょう。また、同じ行に一致するものが2つ以上ある場合は、それらすべてが表示されます。

この問題を解決するためにhead -1を使用できます。

grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1
388
mvp

stdbuf と共に、grepの結果をheadに渡すことができます。

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が消えている間もパイプに何かを出力するのでSIGPIPEheadを受け取ります。

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

28
Venkat Kotra

私のgrepのようなプログラム ack は、どこかで最初にマッチしたところで止まる-1オプションを持っています。 @mvpが参照する-m 1もサポートしています。 1つのファイルにしか存在しないことがわかっているものを見つけるために大きなツリーのソースコードを検索している場合は、それを見つけてCtrl-Cを押す必要がないためです。

22
Andy Lester

findを使ったシングルライナー:

find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit
4
Yam Marcovic