grepコマンドによるテキスト検索と正規表現の活用法

grepコマンドの概要

grep(Global Regular Expression Print)は、LinuxやUnix系OSにおいてテキストファイル内のパターンを検索するために不可欠なコマンドラインツールです。正規表現を使用した高度な検索が可能であり、特定の文字列やパターンを含む行を抽出して標準出力に出力します。また、パイプラインを用いて他のコマンドの出力結果をフィルタリングする場合にも頻繁に利用されます。

基本構文

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

検索パターンには固定文字列または正規表現を指定します。ファイル名を省略した場合、標準入力からデータを読み込みます。

主なオプション一覧

grepの動作を制御するために、多様なオプションが提供されています。以下に頻繁に使用されるものを挙げます。

  • -i, --ignore-case: 大文字と小文字の区別をせずに検索を行います。
  • -v, --invert-match: パターンに一致しない行を表示します(反転検索)。
  • -n, --line-number: 一致した行の行番号を先頭に表示します。
  • -c, --count: 一致した行数を出力します。
  • -r, --recursive: ディレクトリを再帰的に検索します。
  • -l, --files-with-matches: 一致した行の内容ではなく、一致したファイル名のみを出力します。
  • -L, --files-without-match: 一致しなかったファイル名を出力します。
  • -e, --regexp: 検索パターンを明示的に指定します(パターンがハイフンで始まる場合などに有用)。
  • -f, --file=FILE: 検索パターンをファイルから一行ずつ読み込みます。
  • -A NUM, --after-context=NUM: 一致した行の後ろに続く指定行数も表示します。
  • -B NUM, --before-context=NUM: 一致した行の前の指定行数も表示します。
  • -w, --word-regexp: 単語全体(ワード境界内)で一致する場合のみマッチします。

正規表現(基本メタ文字)

grepは正規表現エンジンを内蔵しており、柔軟なパターンマッチングが可能です。

  • .: 任意の1文字に一致します。
  • *: 直前の文字の0回以上の繰り返しに一致します。
  • ^: 行の先頭を表します(例:^Errorは"Error"で始まる行)。
  • $: 行の末尾を表します(例:Finished$は"Finished"で終わる行)。
  • []: 括弧内の任意の1文字に一致します(例:[Tt]estは"Test"または"test")。
  • [^]: 括弧内に含まれない文字に一致します。
  • \<\>: 単語の先頭と末尾をアンカーします。
  • \{m,n\}: 直前の文字のm回以上n回以下の繰り返しに一致します。

実践的な使用例

プロセスの検索とフィルタリング

実行中のプロセスから特定のサービス(例:nginx)を抽出します。

ps aux | grep nginx

grepコマンド自体のプロセスを結果から除外する場合、-vオプションを使用します。

ps aux | grep nginx | grep -v grep

一致するプロセス数のカウント

特定のプロセス(例:httpd)がいくつ稼働しているかを確認します。

ps aux | grep -c httpd

ファイルからのパターン読み込みと行番号表示

patterns.txtに記載された検索キーワードを使い、target.logを検索し、行番号を付けて表示します。

grep -n -f patterns.txt target.log

特定のキーワードを含む行の検索

ログファイルなどから、特定のエラーコードや単語(例:"CRITICAL")を含む行を検索します。

grep "CRITICAL" system.log

複数ファイルへの検索とファイル名表示

複数のファイル(例:app.pyutils.py)から特定の関数定義(例:"def process_data")を検索します。grepはデフォルトで一致した行がどのファイルに含まれているかを表示します。

grep "def process_data" app.py utils.py

行頭パターンの検索

行頭が特定の文字列(例:"Warning")で始まる行を抽出します。

grep "^Warning" application.log

シェルスクリプトでの利用と終了ステータス

grepは検索結果に基づいて終了ステータスを返します。これを利用してシェルスクリプト内で条件分岐を行うことができます。

if grep -q "SUCCESS" operation.log; then
    echo "処理は成功しました。"
else
    echo "処理に失敗したか、ログが見つかりません。"
fi

終了ステータスの意味:

  • 0: 一致するパターンが見つかった(成功)
  • 1: 一致するパターンが見つからなかった
  • 2: エラーが発生した(ファイルが存在しないなど)

ディレクトリ全体の再帰的検索

カレントディレクトリ以下のすべてのファイルから特定の設定文字列(例:"timeout")を含む行を検索します。

grep -r "timeout" ./

5月13日 05:33 投稿