「find」と「grep」を使用して「where」句と同じ操作を実行する方法

「find」と「grep」を使用して「where」句と同じ操作を実行する方法

テキストファイルのフォルダツリーがあり、部分文字列のインスタンスとそのファイルの名前を探したいと思います。

私が次のことをするなら:

find . | xargs cat | grep 'abc'

これにより、部分文字列のインスタンスを見つけることができますが、元のファイルは見つかりません。

助けてくれてありがとう!

答え1

このように実行すると、xargs catファイル名が失われ、データがパイプを流れる間にパイプに渡すための良い方法はありません。

ただし、grep -l一致する文字列を含むファイル名がリストされているため、次のものを使用できます。

find . -type f | xargs grep -l hello

または、ディレクトリを再帰的に検索すると、grep -rスペースや引用符を含むファイル名の問題も解決できます。xargs

grep -lre abc .

ファイル名だけでなく、一致する文字列も必要な場合は、通常の動作を-l得るgrepために削除してください。コマンドラインにパスを指定しても、一致するファイル名を印刷する必要が-rあります。

答え2

xargs重複しています。xargs cat | grepこれにより、grepすべてのファイルの関連コンテンツを含む名前のない入力ストリームのみが表示されます。に変更:

find . -type f -exec grep -H 'abc' {} +

これはファイルごとに呼び出されます(複数のファイルを引数として呼び出すことでgrepインスタンス数を最小限に抑えます)。grepgrep

答え3

find ./ -type f -exec grep -H abc {} \;

または

grep -R 'abc' ./

答え4

awk代わりにcat 試してください。grep

find . -type f | xargs awk '/abc/{printf "%s is from %s\n", $0, FILENAME}'

または単に使用findしてawk

find . -type f -exec awk '/abc/{printf "%s is from %s\n", $0, FILENAME}' {} +

関連情報