連載
» 2016年04月15日 05時00分 UPDATE

Linux基本コマンドTips(11):【 grep 】コマンド(応用編その2)――複数の文字列を検索する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回、前々回に続き、今回も「grep」コマンドの使い方を解説します。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は「grep」コマンドで複数の文字列を検索する方法を紹介します。

grepコマンドとは?

 「grep」は、ファイルの中で「文字列(パターン)」が含まれている行を表示するコマンドです。検索対象には、複数のファイルやディレクトリを指定できます。

 ファイルを指定しなかった場合は、標準入力から読み込みます。パイプ(|)と組み合わせて、他のコマンドの出力結果から必要な箇所だけを絞り込んで表示する際によく使われます。


grepコマンドの書式

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

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

※[ ]は省略可能な引数を示しています



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 画面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 画面2 「dmesg | grep -i "network\|video"」で、dmesgコマンドの実行結果から「network」または「video」を含む行を表示(検索パターンに"network\|video"を指定)、大小文字は区別しない(-iオプション)


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

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

コマンド実行例

grep -f 検索文字列リスト テキストファイル

コマンド | grep -f 検索文字列リスト


画面3 画面3 「dmesg | grep -i -f wordlist」で、dmesgコマンドの実行結果から「wordlist」に記述されている文字列を含む行だけを表示(-f wordlist)、大小文字は区別しない(-iオプション)


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

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

画面4 画面4 「dmesg | grep -i video」で、dmesgコマンドの実行結果から「video」を含む行を表示。「dmesg | grep -i video -i device」でその結果からさらに「device」を含む行だけ表示

 順番が決まっている場合は正規表現で「1つ目の文字列、任意の文字列、2つ目の文字列」のようにす指定するとよいでしょう。

 具体的には「grep "文字列.*文字列"」のように、検索文字列の間に「.*」を入れます(画面5)「.」は任意の文字、「*」は直前文字の0回以上の繰り返しという意味で、「.*」で0文字以上の任意の文字列という意味になります。

画面5 画面5 「dmesg | grep -i "video.*device"」で、dmesgコマンドの実行結果から「videoとdeviceを含む行」を表示、大小文字の区別はしない(-iオプション)

 なお、「.」も「*」も拡張正規表現ではないので「-E」オプションは不要ですが、付けても問題ありません。



筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。