【 grep 】コマンド(応用編その1)――空白を含む文字列を検索する/正規表現を使って検索するLinux基本コマンドTips(10)

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

» 2016年04月13日 05時00分 公開
[西村めぐみ@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=パターン パターンにマッチするディレクトリは検索対象から除外する


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

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

 例えば、ファイルやディレクトリを一覧表示する「ls」コマンドを「-l」オプションを付けて実行すると、ファイルの属性や所有者の情報も併せて表示できます。

 そこで、「rootユーザーが所有していないファイル」という意図で、「rootを含まない行」を「grep -v root」で表示してみましょう(画面1)(※)。

コマンド実行例

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

(テキストファイルから、検索文字列を含まない行だけを表示する)

コマンド | grep -v 検索文字列

(コマンドの実行結果から、検索文字列を含まない行だけを表示する)

ls -l /etc | grep -v root

(「ls -l /etc」の結果から、rootを含まない行だけを表示する)


画面1 画面1 「ls -l /etc」の実行結果から、「root」という文字列を含まない行(「-v」オプション)だけを表示する

※実は、これでは「root」という文字列を含む名前のファイルがあった場合も除外されてしまいます。「/etc」に「root」という文字列を含むファイルがあるかどうかは、「ls /etc/*root*」で確認できます。あるいはgrepコマンドを使うのであれば「-l」オプションを付けずに「ls /etc | grep root」で確認できます。





空白を含む文字列を検索する

 「ls -l」の実行結果には、「所有者」と「所有グループ(※)」が表示されます。

※Linuxではユーザーとグループを使ってファイルの権限などを管理します。「管理者グループが所有するファイル」「管理者グループだけが実行できるファイル」のような管理が可能です。



 そこで、「所有者と所有グループが共にrootではないファイル」という意図で「root rootを含まない行」を表示してみましょう。この場合、検索文字列に空白が入るので引用符("または')で囲みます(画面2)。

コマンド実行例

ls -l /etc/ | grep -v "root root"

(“root root”を含まない行を表示する)


画面2 画面2 「ls -l /etc」の実行結果から"root root"という文字列を含まない行を表示(所有者・所有グループともにrootであるファイル以外が表示される)

正規表現を使って検索する

 「ls -l」の表示は固定幅となっています。従って、所有者と所有グループの間の空白が1つとは限りません。今回の場合、「/etc」には「root」より長い名前のユーザーが所有しているファイルがなかったため「root root」と指定できたにすぎません。

 例えば、「/proc」(プロセス情報を管理しているディレクトリ)の場合、もっと長い名前の所有者のファイルがあるはずです。そこで、「root、1つ以上の空白、root、の組み合わせを含まない行」のようにしてみましょう。このような指定をする場合には、「正規表現」を使います。

 正規表現では、空白(スペース)を「\s」で表します。先ほどの「root root」であれば「root\sroot」と表すことができます。さらに、「\s+」のように「+」記号を付けると「1つ以上の空白」という意味になります。「+」は「直前のパターンの1回以上の繰り返し」という意味の記号です。

 従って、「root、1つ以上の空白、root」は「root\s+root」と表すことができます。正規表現を使って指定したいので、「-E」オプションを付けて実行します(画面3)。

コマンド実行例

ls -l /proc/ | grep -v -E "root\s+root"

(“root、1つ以上の空白、root”を含まない行を表示する)


画面3 画面3 「ls -l /proc」の実行結果から「root root」という文字列を含まない行を表示する(rootとrootの間は1つ以上の空白)


基本正規表現と拡張正規表現

 正規表現にも幾つかの種類があり、grepコマンドでは基本正規表現拡張正規表現Perlの正規表現を使用することができます。

 基本正規表現を使う場合には「-G」オプション、拡張正規表現を使う場合には「-E」オプション、Perl正規表現を使う場合には「-P」オプションを指定します。「-G」オプションは省略可能なので、基本正規表現はオプションなしで使用できます。

 ちなみに、先ほどの「root\s+root」を基本正規表現で表すと、「root\s\s*root」となります。「*」記号は「直前の0回以上の繰り返し」という意味で、「\s」で空白1つ、「\s*」で0個以上の空白、これを組み合わせて「1個以上の空白」を表現しています。

 最後に、grepコマンドで使える主な正規表現を以下の表に示しましたので参考にしてください。

●基本正規表現
記号 意味 使用例
^ 行頭 ^abc:abcから始まる行
$ 行末 abc$:abcで終わる行
\< 語頭 \<abc:abcで始まる単語
\> 語尾 abc\>:abcで終わる単語
. 改行以外の任意の文字
\w アルファベットと数字
\W アルファベットと数字以外
[...] 囲まれている文字のどれか [abc]:abcのどれか
[^...] 囲まれている文字でない文字 [^abc]:abc以外
[n-n] 指定範囲のどれかの文字 [a-c]:abcのどれか

●拡張正規表現
記号 意味 使用例
* 直前文字の0回以上の繰り返し
+ 直前文字の1回以上の繰り返し
{n} 直前文字のn回の繰り返し [0-9]{3}:3桁の数値
{n,} 直前文字のn回以上の繰り返し [0-9]{3,}:3桁以上の数値
{,m} 直前文字のm回以下の繰り返し [0-9]{,5}:5桁以下の数値
{n,m} 直前文字のn回からm回の繰り返し [0-9]{3,5}=3桁から5桁の数値
| または txt|doc:txtまたはdoc
() ()内をひとまとまりとする (abc){2}:abcabc

※検索文字列の中に特殊文字と同じ文字を使いたい場合は、「\」を付けます。例えば、「\w」という文字を探したい場合は「\\w」とします。



※正規表現として「?, +, {, |, (, )」を使いたい場合は、「\?」のように「\」を付けるか、「-E」オプションを付ける必要があります。





筆者紹介

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

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


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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