grep
に出力の一致する行の前にファイル名を表示させるにはどうすればいいですか?
ファイル名が表示されるように、grep
が複数のファイルを処理していると考えさせるために、このちょっとしたトリックを試してみてください。
grep 'pattern' file /dev/null
行番号も取得するには
grep -n 'pattern' file /dev/null
-H
と-n
のオプションが利用可能な場合(man grep
があなたの友達です):
$ cat file
foo
bar
foobar
$ grep -H foo file
file:foo
file:foobar
$ grep -Hn foo file
file:1:foo
file:3:foobar
オプション:
-H、 - with-filename
一致ごとにファイル名を印刷します。検索するファイルが複数ある場合はこれがデフォルトです。
-n、 - line-number
入力ファイル内で、出力の各行の先頭に1から始まる行番号を付けます。 (-nはPOSIXで指定されています。)
-H
はGNUの拡張子ですが、-n
は POSIXで指定
トリックは必要ありません。
grep --with-filename 'pattern' file
行番号付き
grep -n --with-filename 'pattern' file
この記事のおかげで、私はなんとかこれを達成できました。
あなたはいくつかのファイルを見つけたいと思うでしょう、パターン(例えばfilename=logfile.DATE
)を持ついくつかのディレクトリの中の異なる名前だがパターン(例えば/logsapp1, /logsapp2
)でログを言うことができます。各ファイルにはgrepしたいパターンがあり(例:"init time"
)、各ファイルの"init time"
を持ちたいが、それがどのファイルに属しているかは知っていたい。
find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt
それならoutputfilename.txt
は次のようになります。
./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms
一般に
find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt
説明:
find
コマンドはパターンに基づいてファイル名を検索します
その後、パイプxargs -I{}
はfind
の出力を{}
にリダイレクトします。
これはgrep ""pattern" {}
の入力になります
grep
にファイル名を表示させるためのトリック\dev\null
最後に、tee outputfile.txt
を使用してファイルに出力を書き込みます。
これは私にとってgrep
バージョン9.0.5 build 1989でうまくいきました。
これは以前のソリューションからのわずかな修正です。私の例では、bashスクリプトで標準エラーのリダイレクトを探しています:grep '2>' $(find . -name "*.bash")