grep の結果でファイル名のみ表示する

2022-06-13

grepで検索結果をマッチしたファイル名のみ表示

grepで検索した結果で、ファイル名のみ表示したい場合は「grep -l pattern file1 file2…」とすれば、ファイル名のみ表示します

$ grep ssl /etc/httpd/conf.d/*.conf | head
/etc/httpd/conf.d/ssl.conf:SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
/etc/httpd/conf.d/ssl.conf:SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
/etc/httpd/conf.d/ssl.conf:#   block. So, if available, use this one instead. Read the mod_ssl User
/etc/httpd/conf.d/ssl.conf:# accelerators. Use "openssl engine -v" to list supported
/etc/httpd/conf.d/ssl.conf:ErrorLog logs/ssl_error_log
/etc/httpd/conf.d/ssl.conf:TransferLog logs/ssl_access_log

# -l を使用するとファイル名のみの表記になります
$ grep -l ssl /etc/httpd/conf.d/*.conf | head
/etc/httpd/conf.d/ssl.conf

# 下記のようなテキストファイルがあります
$ cat test1.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
00_44asa

$ cat test2.txt 
01_dasda
01_sdfsd
01_de3s4
01_aht4d
01_44asa

$ cat test3.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
01_44asa

# -l を使用するとパターンマッチする「test1.txt,test2.txt」のみが表示されます
$ grep -l "00" test*.txt
test1.txt
test2.txt

grepで検索結果をマッチしなかったファイル名のみ表示

grepで検索した結果で、マッチしなかったファイル名のみ表示したい場合は、「grep -L pattern file1 file2…」とすれば、検索でヒットしなかったファイル名のみ表示します。

以下のサンプルでは、test1.txt, test2.txt, test3.txt とあります。
00から始まる英数字が、test1.txt には5個、01から始まる英数字が、test2.txt には5個、00から始まる英数字が、test3.txt には4個、01から始まる英数字が1個で構成されています。

このファイルで、「00」で始まる文字がないファイルは、「test2.txt」だけですので、「grep -L “00" test*.txt」とすれば、「test2.txt」が返ってきます

# 下記のようなテキストファイルがあります
$ cat test1.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
00_44asa

$ cat test2.txt 
01_dasda
01_sdfsd
01_de3s4
01_aht4d
01_44asa

$ cat test3.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
01_44asa

$ grep -L "00" test*.txt
test2.txt

検索結果がマッチしない場合の「grep -L」 と「grep -lv」の違い

grepでパターンマッチしない行の抽出は「-v, –invert-match」を利用しますが、これとファイル名のみ表示する「-l, –files-with-matches」と組み合わせて、「grep -lv pattern file1 file2…」 としても検索結果がマッチしないファイルの表示ができますが、この場合はパターンマッチしない行のみ抽出され、そのファイル名のみが表示されるので、「test2.txt, test3.txt」が出力されます。

パターンマッチしないファイルのみが表示したい場合は、「grep -lv pattern file1 file2…」ではなく、「grep -L pattern file1 file2…」とすれば、検索する文字列で一致しないファイル名が表示されます

$ cat test1.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
00_44asa
$ cat test2.txt 
01_dasda
01_sdfsd
01_de3s4
01_aht4d
01_44asa
$ cat test3.txt 
00_dasda
00_sdfsd
00_de3s4
00_aht4d
01_44asa

$ grep -lv "00" test*.txt
test2.txt
test3.txt

# -l を除いて、-v のみで grep すると、パターンマッチしない行のみ抽出されます
$ grep -v "00" test*.txt
test2.txt:01_dasda
test2.txt:01_sdfsd
test2.txt:01_de3s4
test2.txt:01_aht4d
test2.txt:01_44asa
test3.txt:01_44asa