(8)【grep】シェルスクリプトコマンド活用紹介

grepコマンド

  • コマンドの実行結果から必要な箇所だけを抽出する
  • 単語単位で検索する
  • 前後の行も表示する
  • 行番号付きで表示する
  • 複数の文字列を指定して検索する
  • 複数の文字列を指定して検索する(正規表現)
  • 検索文字列をファイルから読み込む
  • どちらも含む行を探したい場合
  • 文字列を含まない行を対象にする

grepコマンド概要

「grep」コマンドは、ファイル中の「文字列(パターン)」が含まれている行を表示するコマンドで、UNIX/Linuxで、最も頻度高く利用されているコマンドの一つです。

 文章中に検索したい文字列の位置や頻出回数を確認する
 ディレクトリ中のファイル一覧を作成し、そのファイル一覧から、該当するファイル名を探索する。

ヒント
抽出した結果をさらに「パイプ|コマンド」で絞り込んだり、その結果を別のファイルに出力したりすることも簡単にできます。

grepコマンドの書式

grep [オプション] 検索パターン ファイル
コマンド | grep [オプション] 検索パターン

grepコマンドの主なオプション

オプション 意味
-i 大文字と小文字を区別しない
-v パターンに一致しない行を表示する
-n 行番号を併せて表示する
-C 一致した行の前後の行も表示する
-e 検索パターンを指定する
-f ファイルに書かれているパターンを検索する
ヒント
一覧のオプションは一部です。 $ man grep などで、grepの使い方を確認してください。

grepコマンド詳細説明

コマンドの実行結果から必要な箇所だけを抽出する

 「dmesg」コマンド(起動時のシステムメッセージを再表示するコマンド)の実行結果から、grepコマンドで“volume”という文字列を含む行だけを表示したい場合は「dmesg | grep volume」と指定します

システムメッセージを表示する

$ dmesg

システムメッセージの出力から「volume」を含む行を抽出する

$ dmesg | grep volume

大文字と小文字を「-iオプション」を付与して区別しないで抽出する

$ dmesg | grep -i volume
ヒント
dmesg コマンドは、システムメッセージを表示するコマンドです。

単語単位で検索する

「volume」という文字列を検索したい場合、、検索結果には「volume」と「vboxvolume」が表示される場合もあります。“volumeという単語のみ”を検索対象としたい場合には、「-w」オプション(–word-regexp)を使用します

単語単位で検索する

$ dmesg | grep -i -w volume

前後の行も表示する

 文字列を検索する際には、該当する行の前後も表示されていると分かりやすい場合があります。例えば、前後2行ずつ表示したい場合は、「-2」のように数字で指定します。これは「-C(–context=)」オプションと同じです。

$ dmesg | grep -w -C2 volume
ヒント
ログなどでの利用は効果的ではありませんが、ドキュメント内を検索する場合に、GoogleのSnippetのように前後の文章が表示されることで、よりわかりやすくなります。さらに次の項目では、検索結果の評判号を表示させることもできます。

行番号付きで表示する

grepコマンドでの検索結果に行番号を付けて表示したい場合は、「-n」オプション(–line-number)を使用します。「行番号:」のように表示されますが、前後の行も併せて表示している場合は、前後の行は「行番号-」のように「-」記号で、該当する行は「:」記号で示されます。

$ dmesg | grep -w -C2 -n volume

複数の文字列を指定して検索する

grepコマンドで「volumeまたはkeybagを含む行を検索」のように、複数の文字列を検索したい場合には、「-e」オプションを付けて、それぞれが「検索パターン」であることを明示します。

$ dmesg | grep -i -e keybag -e volume

複数の文字列を指定して検索する

複数の文字列を検索したい場合、正規表現で“または”という意味の「|」記号を使って指定することもできます。

$ dmesg | grep -i "keybag\|volume"
ヒント
ここでは OR 条件で抽出することを目的としています。AND条件で抽出する場合は、grep コマンドを「|」パイプコマンドで連結させます。

どちらの検索ワードも含む行

$ dmesg | grep -i volume | grep -i keybag

検索文字列をファイルから読み込む

検索したい文字列が常に決まっている場合や、他のコマンドで単語をリストアップしているなどで、検索文字列のリストがあるような場合、「-f」オプションでリストのファイルを指定するとよいでしょう。

$ cat wordlist
keybag
volume
$ dmesg | grep -i -f wordlist
ヒント
この使い方は意外と知られていないのです。一般的にはwordlistをシェルスクリプトであらかじめ作成しておき、while read line; do などで wordlistを順番にgrepコマンドに渡す手法が多いです。

:> wordlist
echo "keybag" >> wordlist;
echo "volume" >> wordlist;

cat wordlist | while read line; do
  echo "$line での検索";
  dmesg | grep "$line" ;
  echo "";
done

どちらも含む行を探したい場合

 「どちらの検索ワードも含む行」としたい場合は、検索結果をさらにgrepするのが簡単です。

$ dmesg | grep -i volume
$ dmesg | grep -i keybag 

# どちらの検索ワードも含む行
$ dmesg | grep -i volume | grep -i keybag

文字列を含まない行を対象にする

grepコマンドで「~を含まない行」だけを表示したい場合は「-v」オプション(「–invert-match」オプション)を使います。

# keybag を含みvolumeを含まない検索結果
$ dmesg | grep -i keybag | grep -v volume
ヒント
-v オプションはgrepコマンドのオプションの中で最も強力で利用頻度が高いです。「パターンに一致しない行を表示する」という意味合いとなります。

書籍の紹介

(9)【file】シェルスクリプトコマンド活用紹介

(9)【file】シェルスクリプトコマンド活用紹介

第1回 pythonで自然言語解析(1)

第1回 pythonで自然言語解析(1)