【 grep 】コマンド(応用編その2)――複数の文字列を検索する:Linux基本コマンドTips(11)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回、前々回に続き、今回も「grep」コマンドの使い方を解説します。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は「grep」コマンドで複数の文字列を検索する方法を紹介します。
- grepコマンド――特定の文字を含む行を抽出する(本連載 第9回)
- grepコマンド(応用編その1)――空白を含む文字列を検索する/正規表現を使って検索する(本連載 第10回)
grepコマンドとは?
「grep」は、ファイルの中で「文字列(パターン)」が含まれている行を表示するコマンドです。検索対象には、複数のファイルやディレクトリを指定できます。
ファイルを指定しなかった場合は、標準入力から読み込みます。パイプ(|)と組み合わせて、他のコマンドの出力結果から必要な箇所だけを絞り込んで表示する際によく使われます。
- [参考記事]パイプとリダイレクトでコマンドを組み合わせて実行しよう(連載:“応用力”をつけるためのLinux再入門 第6回)
grepコマンドの主なオプション
grepコマンドの主なオプションは次の通りです。
短いオプション | 長いオプション | 意味 |
---|---|---|
-e 検索パターン | --regexp=パターン | 検索パターンを指定する |
-G | --basic-regexp | 検索に基本正規表現を使う |
-E | --extended-regexp | 検索に拡張正規表現を使う |
-P | --perl-regexp | 検索にPerl正規表現を使う |
-f ファイル | --file=ファイル | ファイルに書かれているパターンを検索する |
-i | --ignore-case | 大文字と小文字を区別しない |
-w | --word-regexp | 単語全体でパターンと一致するものを検索する |
-x | --line-regexp | 行全体がパターンと一致するものを検索する |
短いオプション | 長いオプション | 意味 |
---|---|---|
-v | --invert-match | パターンに一致しない行を表示する |
-s | --no-messages | エラーメッセージを表示しない |
-q | --quiet --silent |
結果を表示しない(主にシェルスクリプトなどで判定用に使う) |
-L | --files-without-match | 一致するものが含まれていないファイルのファイル名のみ表示する |
-l | --files-with-matches | 一致するものが含まれているファイルのファイル名のみ表示する |
-c | --count | 一致するものが含まれている回数のみ表示 |
-m 回数 | --max-count=回数 | パターンが指定した回数に達したら処理を終了する |
-o | --only-matching | 一致した箇所だけを表示する(通常は行単位で表示) |
-n | --line-number | 行番号を併せて表示する |
-b | --byte-offset | パターンが何文字目にあるかを併せて表示する |
-H | --with-filename | ファイル名を併せて表示する |
-h | --no-filename | ファイル名を表示しない(複数ファイル指定時) |
--color=WHEN | 見つかったパターンを目立たせる(WHEN部分にはalways、never、autoを指定) | |
-B 行数 | --before-context=行数 | 一致した行の前の行も表示する |
-A 行数 | --after-context=行数 | 一致した行の後の行も表示する |
-C 行数,-行数 | --context=行数 | 一致した行の前後の行も表示する |
短いオプション | 長いオプション | 意味 |
---|---|---|
-d ACTION | --directories=ACTION | 検索対象にディレクトリを指定した場合の動作(ACTION部分にはread、recurse、skipを指定) |
-r | --recursive | ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する(--directories=recurse相当) |
-R | --dereference-recursive | サブディレクトリも含めて検索、さらにシンボリックリンクの先も対象とする |
--include=パターン | パターンにマッチするファイルだけを対象とする | |
--exclude=パターン | パターンにマッチするファイルは検索対象から除外する | |
--exclude-from=ファイル | 対象から除外するファイル名のパターンをファイルから読み込む | |
--exclude-dir=パターン | パターンにマッチするディレクトリは検索対象から除外する |
複数の文字列を指定して検索する(「-e」オプションによる明示)
grepコマンドで「videoまたはnetworkを含む行を検索」のように、複数の文字列を検索したい場合には、「-e」オプションを付けて、それぞれが「検索パターン」であることを明示します(※)。
※「-e」オプションを指定せず「grep あああ いいい ううう」のように指定した場合、1つ目の「あああ」が検索文字列、2つ目以降は検索対象であるファイルやディレクトリの指定と解釈されます。
コマンド実行例
grep -e 文字列1 -e 文字列2 -e 文字列3 テキストファイル
コマンド | grep -e 文字列1 -e 文字列2 -e 文字列3
「-e」オプションは、他のオプションと併用することも可能です。例えば、大小文字を区別しない「-i」オプションと併用する場合は、「grep -i -e 文字列1 -e 文字列2」のように指定します(※)。
※「grep -ie 文字列1 -e 文字列2」のように、「-e」と「-i」をまとめることもできます。ただし、検索文字列の直前に「-e」がくる必要があるため、「grep -ei 文字列1 -e 文字列2」と指定することはできません。
この場合、「-i」オプションはコマンド全体に有効なので、文字列1、文字列2ともに大小文字が区別されなくなります(画面1)。
画面1 「dmesg | grep -i -e network -e video」で、dmesgコマンドの実行結果から「network」または「video」を含む行を表示(-e network -e video)、大小文字は区別しない(-iオプション)
複数の文字列を指定して検索する(正規表現)
複数の文字列を検索したい場合、正規表現で“または”という意味の「|」記号を使って指定することもできます。「拡張正規表現」(本連載 第10回参照)なので「-E」オプションを付けるか、「|」の前に「\」記号を付けて「\|」のように指定します。検索の指定に記号を含むので、全体を引用符(")で囲みましょう(※)(画面2)。
※引用符(")を使わない場合は「\」記号と「/」記号にそれぞれ「\」を付けて、「network\\\/video」のように指定することになります。
コマンド実行例
grep "文字列1\|文字列2\|文字列3" テキストファイル
grep -E "文字列1|文字列2|文字列3" テキストファイル
コマンド | grep "文字列1\|文字列2\|文字列3"
コマンド | grep -E "文字列1|文字列2|文字列3"
画面2 「dmesg | grep -i "network\|video"」で、dmesgコマンドの実行結果から「network」または「video」を含む行を表示(検索パターンに"network\|video"を指定)、大小文字は区別しない(-iオプション)
検索文字列をファイルから読み込む
検索したい文字列が常に決まっている場合や、他のコマンドで単語をリストアップしているなどで、検索文字列のリストがあるような場合、「-f」オプションでリストのファイルを指定するとよいでしょう(画面3)。
コマンド実行例
grep -f 検索文字列リスト テキストファイル
コマンド | grep -f 検索文字列リスト
画面3 「dmesg | grep -i -f wordlist」で、dmesgコマンドの実行結果から「wordlist」に記述されている文字列を含む行だけを表示(-f wordlist)、大小文字は区別しない(-iオプション)
どちらも含む行を探したい場合
「どちらの検索ワードも含む行」としたい場合は、検索結果をさらにgrepするのが簡単です(画面4)。
画面4 「dmesg | grep -i video」で、dmesgコマンドの実行結果から「video」を含む行を表示。「dmesg | grep -i video -i device」でその結果からさらに「device」を含む行だけ表示
順番が決まっている場合は正規表現で「1つ目の文字列、任意の文字列、2つ目の文字列」のようにす指定するとよいでしょう。
具体的には「grep "文字列.*文字列"」のように、検索文字列の間に「.*」を入れます(画面5)「.」は任意の文字、「*」は直前文字の0回以上の繰り返しという意味で、「.*」で0文字以上の任意の文字列という意味になります。
なお、「.」も「*」も拡張正規表現ではないので「-E」オプションは不要ですが、付けても問題ありません。
筆者紹介
西村 めぐみ(にしむら めぐみ)
PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.