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


282

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


2
plsがgrepのバージョンを伝えるgrep --version
ケント

3
kent、それgrep --versionはgrepバージョンを知るために使用されるコマンドですか?もしそうなら、それは機能しません。grepのバージョンを確認する他のコマンドが見つかりませんでした。
Vivek 2013年

2
良い質問ですが、「Osバージョン」
はわかり

1
OSとバージョンはここでは関係ありません。
MD XF

grep 'pattern' *
user0

回答:


430

grepファイル名を表示するために、この小さなトリックを試して、複数のファイルを扱っていると思い込ませてください。

grep 'pattern' file /dev/null

行番号も取得するには:

grep -n 'pattern' file /dev/null

6
はい、うまくいきました。/dev/nullこのコマンドに追加することの重要性を教えていただけますか?
Vivek 2013年

55
grep複数のファイル名が指定されている場合は、一致する前のファイル名が自動的に表示されますが、入力ファイルが1つの場合はファイル名が省略されます。使用することにより/dev/null、余分な入力ファイルとしてgrep「思う」それは、複数のファイルを扱うが、もちろん空のそれが一致リストに表示されませんので、は/ dev / nullは、..です
Scrutinizer

32
/ dev / nullの使用は巧妙なトリックですが、私は-Hフラグの以下の提案がより良い答えだと思います。
JohnQ 2013年

22
OK、しかし-Hgrep のオプションはPOSIXの一部ではなく、使用されているOSはSolaris 10です。標準のgrepもPOSIX準拠のバージョンのgrepもこの-Hオプションを備えていません。
Scrutinizer 2013年

4
findでgrepを使用する場合は、これが重要です。たとえば、サブディレクトリでfind . -name foo -exec grep pattern {} \;指定さfooれたファイルがたくさんあるとしてfindgrep、一度に1つのファイルを操作するだけです。この/dev/nullトリックは、私が試したすべてのlinux / osxフレーバーで機能するようです。注意してください-H、それはきれいだと思いますが、下記のように、あなたのバージョンのではサポートされいないかもしれませんgrep
ジョンV

296

オプションが-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で指定されています。)

-HGNU拡張機能ですが、POSIX-n指定されています


3
いいえ、-Hここではサポートされていません。
Vivek

1
サポートされていますが、常にgrepを提供します:ファイル:そのようなファイルやディレクトリはありません
pal4life

2
ubuntu -Hおよび-nで動作します。おそらく* nixのすべての新しいバージョン
tgkprogで2014年

1
私は何年もの間、これらのオプションがあるとは思わずに苦労してきました!
GreenSaguaro 2015

45

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

grep --with-filename 'pattern' file

行番号付き:

grep -n --with-filename 'pattern' file

3
@codeforester他grepのは知らないので、わかりません。
MD XF

2
涼しい !これはLinuxで機能しました。Macを使用している場合は、brewでcoreutilsをインストールできます。そして、PATH = "/ usr / local / opt / coreutils / libexec / gnubin:$ PATH"をあなたの.bashrcに
追加してください

2
これは(また)MinGW(1.0.17と思います)で動作しました。
Peter Mortensen

組み込みのMac grep(2.5.1-FreeBSD)で動作します。ただし、Homebrewの代替grepを使用するには、実行してからを使用する方法もありbrew install grepますggrep。PATHを変更する必要はありません。
wonderlr

5

これについては、この投稿のおかげで、なんとか実現できました。

複数のファイルを検索したい場合は、パターン(例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ビルド1989 で私に役立ちました。


3
または単に検索を使用するfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
マーティン

1

これは、以前のソリューションからのわずかな変更です。私の例では、bashスクリプトでstderrリダイレクトを探します。 grep '2>' $(find . -name "*.bash")


-7
grep 'search this' *.txt

すべての.txtファイルを検索するのに役立ちました(もちろん、独自の検索値を入力してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.