egrepコマンド

拡張正規表現によってファイルやコマンド出力の文字列から目的の情報を検索する。


概要

    オプション


      egrepコマンド概要


      正規表現とは

      正規表現とは、対象のテキストの中から目的の文字列を検索する際に用いる表現のこと。例えば(りんご|みかん)ジュースという正規表現によって、テキストの中から「りんごジュース」か「みかんジュース」を検索することができる。詳しくは正規表現で。ここではコマンドのオプションについて説明。


      行単位で検索

      egrepコマンドは、主にログなどのテキストファイルやコマンドの出力に対して使う。これらは行単位に情報がまとめられており、基本的に行単位で検索を行う(行をまたがった表現を探すのではなく)。


      egrepコマンドの基本

      egrepコマンドは、ファイルやコマンド出力に対して次のように使う。正規表現は基本的に'"で囲む。

      ファイルの例

      egrep '正規表現' file1 file2…

      コマンド出力の例

      コマンド | egrep '正規表現'

      マッチすると

      input="りんごジュース
      みかんジュース"
      
      echo "$input" | egrep 'りんご'
      りんごジュース
      

      マッチするとマッチした行全体が表示されるが、多くの環境ではマッチ部分は色で強調される(--color=autoオプション)。

      # ~/.bashrcなどでaliasが定義されていることが多い
      # エイリアスの確認
      alias grep egrep
      alias grep='grep --color=auto'
      alias egrep='egrep --color=auto'
      

      複数ファイルでegrepした場合の表示

      ファイル名:マッチ行
      ファイル名:マッチ行

      行頭にファイル名が表示される。常にファイル名表示させるなら、--with-filenameオプション、常に省略なら、--no-filenameオプション。


      終了ステータス

      終了ステータスはマッチすれば0、マッチしなければ1

      echo "りんごジュース" | egrep 'りんご'; echo $?
      りんごジュース
      0
      
      echo "りんごジュース" | egrep 'いちご'; echo $?
      1
      

      大文字小文字を区別しない: --ignore-case

      正規表現によらずに英字の大文字・小文字を区別しないなら、--ignore-caseオプション。

      echo 'AbC aBc' | egrep --ignore-case 'abc'
      AbC aBc
      

      正規表現でこれをやるなら[aA][bB][cC]などと煩雑になる。

      echo 'AbC aBc' | egrep '[aA][bB][cC]'
      AbC aBc
      

      マッチしない行を表示: --invert-match

      逆にマッチしなかった行だけを表示するなら、--invert-matchオプション。

      input="りんごジュース
      みかんジュース"
      
      echo "$input" | egrep --invert-match 'りんご'
      みかんジュース
      

      行全体とマッチ: --line-regexp

      行の一部ではなく行頭から行末まで完全にマッチさせるなら、--line-regexpオプション。

      input="りんご
      りんごジュース"
      
      echo "$input" | egrep --line-regexp 'りんご'
      りんご
      

      正規表現でこれをやるなら、行頭行末にマッチさせて、

      echo "$input" | egrep '^りんご$'

      マッチの行数をカウント: --count

      マッチの行数をカウントするなら、--countオプション。--invert-matchと共に使うと、マッチしなかった行数をカウント。

      input="りんごジュース
      いちごアイス
      りんごアイス"
      
      echo "$input" | egrep --count 'りんご'
      2
      
      echo "$input" | egrep --count --invert-match 'りんご'
      1

      マッチの最大行数: --max-count

      マッチの最大行数(その数で検索終了)を指定するなら、--max-countオプションで最大値を指定する。

      input="りんごジュース
      りんごアイス"
      
      echo "$input" | egrep --max-count=1 'りんご'
      りんごジュース
      

      上記では--max-count=1にすることで、最初にマッチしたものだけ表示している。


      マッチした部分のみ表示: --only-matching

      マッチしたらその行全体が出力されるのがデフォルトだが、--only-matchingオプションはマッチした部分のみを、マッチごとに1行ずつ出力する。

      echo "りんごジュース りんごアイス" | egrep --only-matching 'りんご'
      りんご
      りんご
      

      行番号表示: --line-number

      マッチした行番号とともに出力するなら、--line-numberオプション。

      input="りんごジュース
      いちごアイス
      りんごアイス"
      
      echo "$input" | egrep --line-number 'りんご'
      1:りんごジュース
      3:りんごアイス
      

      マッチ行の前後も表示: --after-context, --before-context

      マッチした行だけでなくその前後の行も表示するなら、--after-context--before-contextオプションで行数を指定する。

      input="りんごジュース
      いちごアイス
      りんごアイス"
      
      echo "$input" | egrep --after-context=1 'いちご'
      いちごアイス
      りんごアイス
      
      echo "$input" | egrep --before-context=1 'いちご'
      りんごジュース
      いちごアイス
      

      ディレクトリを再帰的に検索: --recursive

      再帰的(ディレクトリ下層のファイルも対象)に検索するなら、--recursiveオプション。

      egrep --recursive '正規表現' ディレクトリ

      Perlの正規表現(最短一致): grep --perl-regexp

      最短一致など、Perlの正規表現を使うならegrepではなく、grep --perl-regexp(grep -P)。