私は最初のマッチだけを返すことを望んで以下の引数でgrepを使ってディレクトリを再帰的に検索しています。残念なことに、それは2つ以上を返します - 実際に私が最後に見たときには2つです。特に望ましい結果が得られないと、私はあまりにも多くの議論をしているようです。 : - /
# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory
以下を返します。
Pulsanti Operietur
Pulsanti Operietur
たぶんgrepはこれをするための最良の方法ではないでしょうか?ありがとうございます。
-m 1
は、与えられたファイルの最初の一致を返すことを意味します。しかし、それでも他のファイルを検索し続けるでしょう。また、同じ行に一致するものが2つ以上ある場合は、それらすべてが表示されます。
この問題を解決するためにhead -1
を使用できます。
grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1
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
が消えている間もパイプに何かを出力するのでSIGPIPE
はhead
を受け取ります。
これは、ファイル名に改行が含まれていないと仮定しています。
私のgrepのようなプログラム ack
は、どこかで最初にマッチしたところで止まる-1
オプションを持っています。 @mvpが参照する-m 1
もサポートしています。 1つのファイルにしか存在しないことがわかっているものを見つけるために大きなツリーのソースコードを検索している場合は、それを見つけてCtrl-Cを押す必要がないためです。
find
を使ったシングルライナー:
find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit