grepコマンドで文字列で検索 macOS/Linux/Unix

この記事では、よく使うgrepコマンドの使用例を紹介いたします。grepコマンドは文字列を検索するのに特化したシェルコマンドです。grepを使えばファイル検索などがとても便利になります。ここでは私がmacOS上で使ったコマンドを忘備録として記録します。

ファイルの中身を文字列で検索してパスを一覧表示したい

ディレクトリ内を再帰的に検索

ファイルの内容をキーワードで検索し、指定のディレクトリ下を再帰的に検索するには次のとおりです。

shell
$ grep -lr {キーワード} {起点となるディレクトリのパス}

実際は次のような使い方をします。

shell
$ grep -lr 'Flutter' . 

オプションの意味

さきほど使った grep のオプションの意味は次のとおりです。

オプション意味
-n (--line-number)検索結果に行番号を表示
-l (--files-with-matches)検索結果にファイル名のみ表示
-r (--recursive)ディレクトリ下のファイルを再帰的に読み取る

指定した拡張子のみをターゲットにしたい

指定した拡張子のみをターゲットにしたい場合は、--includeオプションにワイルドカードを指定すれば可能です。

shell
$ grep -lr 'Flutter' . --include='*.md'

これ以外にも grep でできる便利なことはたくさんあるので、今後も追記していきます。

他のコマンドと組み合わせる

ここからは、他のコマンドと組み合わせたgrepコマンドの活用事例をご紹介します。

ls + grepでディレクトリのみ表示

次は、ls コマンドで標準出力した結果から、grep を使ってディレクトリのみを表示させるシェルコマンド例です。

shell
$ ls -al | grep ^d                              
drwxr-xr-x@ 23 mopipico  staff    736 Jul 16 20:35 .
drwxr-xr-x@ 11 mopipico  staff    352 Jul 16 19:03 ..
drwxr-xr-x  13 mopipico  staff    416 Jul 16 20:28 arduino-pulse-oximetry
drwxr-xr-x  10 mopipico  staff    320 Jul 16 20:35 arduino-thermistor

通常、ディレクトリには先頭に「d」の頭文字が付与されるため、正規表現の^dで先頭一致させているわけですね。

cat + grepで文字列がマッチする行を表示する

cat コマンドはファイルの中身を標準出力するコマンドですが、特定の文字列が含まれている一行のみ表示したい場合は、grep パイプで組み合わせると便利です。
shell
$ cat hoge.txt | grep 'hello'

上のシェルを実行すると、もしもhoge.txtに「hello」という文字列が含まれていたらその行のみを標準出力します。

その前後の行も表示したい場合は-B 行数オプション(ビフォア)または-A 行数オプション(アフター)を付けることで可能です。前後を合わせて指定したい場合は-C 行数オプションを使います。

shell
$ cat hoge.txt | grep -C 2 'hello'

このシェルを実行すると、「hello」という文字列が含まれている行の前後2行も標準出力されます。

特定の文字列を含む行以外を表示する

shell
$ sudo cat /var/log/nginx/error.log.1 | grep -v github.css

マッチした行から数行表示させたい

grep で一致した箇所から指定の行数を表示させるには、grep-A オプション(After)を使うと便利です。以下のように実行してください:
bash
grep "マッチング文字列"  something.txt -A 行数

例えば、5行を表示させたい場合は:

bash
grep "マッチング文字列"  something.txt -A 5

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム