ウェブサイト検索

grepを使用して一致する行の前にファイル名と行番号を表示する方法


grepは、ファイルの内容や渡された入力を検索するためによく使用されるLinuxユーティリティです。複数のファイルを検索する際には、特にシェルスクリプトで自動化する際に、ファイル名と行番号を表示することが便利です。

grepを使ってファイル名を表示する

デフォルトでは、grepに複数のファイルを渡すと、それを表示します

filename:

明確にするために一致した行の前に。実際、この動作は -h フラグを使用してオフにすることができ、ファイル名は決して表示されません。

しかし、grepに1つのファイルしか渡さない場合、デフォルトではファイル名が表示されません。これはシェルスクリプトを使って自動化する際に問題になる可能性があります。なぜなら、ディレクトリ内にどれだけのファイルがあるかわからず、ファイル名が存在することに依存する自動化が壊れる可能性があるからです。

単純な修正は、大文字の -H フラグを使用することです。これは、-hの逆の動作をし、入力としてファイルが1つだけ渡される場合でも、常にファイル名を有効にします。

grep -H "foo" file

-Hフラグには、予期しないが便利な効果があります。stdinからの入力、例えばUnixパイプと組み合わせると、ファイル名の代わりに(standard input):と表示されます。

grepを使って行番号を表示する

この-nフラグと組み合わせて、行番号を取得することもできます:

grep -Hn "foo"

POSIX準拠のハック

grepの-HフラグはPOSIX準拠ではなく、いくつかのあまり知られていないUnixベースのオペレーティングシステムでは利用できません。幸いなことに、/dev/nullを偽の2番目のファイル入力としてgrepに渡すことで、複数のファイルがあると考えさせるハックがあります:

関連記事: