web-dev-qa-db-ja.com

一致する行の前にファイル名を表示

grepに出力の一致する行の前にファイル名を表示させるにはどうすればいいですか?

234
Vivek

ファイル名が表示されるように、grepが複数のファイルを処理していると考えさせるために、このちょっとしたトリックを試してみてください。

grep 'pattern' file /dev/null

行番号も取得するには

grep -n 'pattern' file /dev/null
376
Scrutinizer

-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の拡張子ですが、-nPOSIXで指定

252
Chris Seymour

トリックは必要ありません。

grep --with-filename 'pattern' file

行番号付き

grep -n --with-filename 'pattern' file
38
MD XF

この記事のおかげで、私はなんとかこれを達成できました。

あなたはいくつかのファイルを見つけたいと思うでしょう、パターン(例えば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")

1
Richard Jessop