grepの-lオプションと-Lオプション

grepの-lオプションと-Lオプション。マニュアルを見ると、それぞれ以下のように説明されている。

-l, --files-with-matches
通常の出力はしません。その代わりに、grepを普通に実行した際に、何らかの検索結果を表示する
ような入力ファイルの名前を列挙します (訳注: すなわち、-lオプションを指定すると、-vオプシ
ョンを同時に指定しない場合は、パターンにマッチする文字列を含む行が存在するファイルの名前
を列挙するということです)。 個々のファイルに対する走査は、最初のマッチで終了します。 (-l
オプションは POSIX で規定されています)

-L, --files-without-match
通常の出力はしません。その代わりに、grepを普通に実行した際に、何の検索結果も表示しないよ
うな入力ファイルの名前を列挙します (訳注: すなわち、-Lオプションを指定すると、-vオプショ
ンを同時に指定しない場合は、パターンにマッチする文字列を含む行がまったく存在しないファイ
ルの名前を列挙するということです) 。個々のファイルに対する走査は、最初のマッチで終了しま
す。

-lと-Lは反対の意味を持つようだ。それでは、-Lと-lv、-lと-Lvは同じ意味なのか、という質問をときどき受けることがある。先に答えを言うと、4つは全て異なる意味を持つ。それぞれの動作を確認しよう。

grep -l pattern file1 file2 file3...
パターンにマッチする行が1行以上あるファイルの名前を表示する。
grep -lv pattern file1 file2 file3...
パターンにマッチしない行が1行以上あるファイルの名前を表示する。
grep -L pattern file1 file2 file3...
パターンにマッチする行が1行もないファイルの名前を表示する。言い換えると、全ての行がパターンにマッチしないファイルの名前を表示する。
grep -Lv pattern file1 file2 file3...
パターンにマッチしない行が1行もないファイルの名前を表示する。言い換えると、全ての行がパターンにマッチするファイルの名前を表示する。
$ cat file1
a
b
c
$ cat file2
a
a
a
$ cat file3
b
b
b
$ grep -l  a file1 file2 file3
file1
file2
$ grep -lv a file1 file2 file3
file1
file3
$ grep -L  a file1 file2 file3
file3
$ grep -Lv a file1 file2 file3
file2

ここまで読んでくださった方は、-l、-lv、-L、-Lvの違いをおわかりになられたでしょうか。