ディレクトリに多くのファイルがあり(Javaアプリケーションのログ - 1行に1つのレコード)、検索文字列を含むすべてのファイル名を一覧表示し、特定のファイルにその文字列が表示されるすべての項目を一覧表示したいと思います。
私はこれまでこれを使ってきました。ここではファイル名を取得し、以下では一致する行を取得しましたが、ファイル名の一致行がどのファイル名から来たのかわかりません。
#!/bin/bash
cd ${DIRECTORY}
clear
echo 'WARNINGS'
egrep -l "WARN" * | sort
echo ''
cat * | grep 'WARN'
すべてのファイル名(WARNを含む名前のみ)をリストし、一致するすべてのファイルの特定のファイルにWARN文字列を含むすべての行を表示する必要があります。
ベストアンサー1
よく知られていないことは、grep
複数のファイルを検索するときに(成功的に)検索したファイルの名前を印刷できることです。つまり、/dev/null
検索するファイルのリストにそれを含めると、目的の結果が得られます。
$ grep "something" /path/to/file
something (and some other thing)
しかし:
$ grep "something" /dev/null /path/to/file
/path/to/file:something (and some other thing)
これにより、次のことができます。
$ find /path/to/start [-name "<filename pattern>"] \
-exec grep '<searchstr>' /dev/null {} \;
これにより、次の出力が提供されます。
/path/to/start/file1:<searchstr> foo
/path/to/start/file1:<searchstr> bar
/path/to/start/subdir/file2:foo <searchstr> bar
/path/to/start/subdir/file3:bar <searchstr> foo
...
@ilkkachuが正確に指摘したように、私が与えたコマンドは一度に1つのファイルをgrep
。このプロセスを最適化する1つの方法は、次のように書くことです。
$ find /path/to/start [-name "<filename pattern>"] \
-exec grep '<searchstr>' /dev/null {} +
ここでfind
複数のファイル名を一度にgrepに渡すと、grepがあまり頻繁に呼び出されないため、負荷が軽減されます。 1つのファイルしか検索でき/dev/null
ないため、指定する必要があります。find