grep の結果でファイル名のみ表示する
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
ディスカッション
コメント一覧
通り掛かりのコメントで失礼します。検索でマッチしなかったファイル名のみを表示するオプションは、-lv ではなく -L です。
ご指摘有難うございます。「-lv」と「-L」の違いも含めて記事の修正しました
記事の改訂、ありがとうございました。