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
関連記事
アイデアノート > macOSで使えるシェル