grepと正規表現を理解する

grepはテキストの中から条件に合う行を選ぶコマンドです。ファイル名を探すfindとは役割が異なります。文字列そのものを探す方法と、正規表現で形を指定する方法を、GNU grep・LF改行・LC_ALL=Cの小さなファイルで比較します。

この単元で学ぶこと

  • grepの検索対象と選択行を説明する
  • 固定文字列・正規表現・行全体の一致を使い分ける
  • 出力と終了ステータスを別に検証する

本文解説

検索対象は内容 grep PATTERN FILEはFILEを読み、通常はPATTERNに一致する部分を含む行全体を出力します。元のファイルを編集するコマンドではありません。printf 'cat\nCat\nscatter\ndog\n' > animals.txtで検証用の四行を作ると、grep 'cat' animals.txtはcatとscatterの二行です。部分一致なので単語catだけに限りません。

大文字と反転 通常は大文字小文字を区別するのでCatは小文字catに一致しません。grep -i 'cat' animals.txtならcat、Cat、scatterの三行です。grep -v 'cat' animals.txtは一致しないCatとdogを選びます。-vは入力の順番を逆にする意味ではありません。

行の端と全体 正規表現の^は行頭、$は行末の位置を表します。grep '^cat

#39; animals.txtは行全体がcatの行だけです。grep '^cat'はcatで始まる行を選び、末尾を限定しません。grep -x 'cat'も行全体の一致を指定します。-F -xなら固定文字列が行全体と一致する条件です。

固定文字列とメタ文字 正規表現の.は通常改行以外の任意の一文字です。printf 'a.b\naxb\nab\n' > dots.txtにgrep 'a.b'を実行するとa.bとaxbが出ます。grep -F 'a.b'なら点も普通の文字として扱い、a.bだけです。設定値や記号をそのまま探すなら-Fが便利です。

拡張正規表現 grep -E '^(cat|dog)

#39; animals.txtはcatまたはdogの行全体を選びます。|は選択、括弧はまとめる範囲です。grep -E '^[0-9]+
#39;はASCII数字が一文字以上の行に一致します。+は一回以上、*は0回以上です。基本正規表現と拡張正規表現では特殊文字の書き方が異なるため、-Eの有無を明示します。

出力を変えるオプション grep -n 'cat' animals.txtは1:catと3:scatterで、元の行番号が1から付きます。grep -c 'cat' animals.txtは一致した行数2だけを出します。一行にcatが二回あっても-cでは一行です。-oは一致した部分だけを出すGNU grepの機能で、-cとは目的が違います。

終了ステータス 通常のGNU grepは選択行があれば0、なければ1、エラーなら2です。直後のprintf '%s\n' "$?"などで確認します。出力が空でも、無一致と読取りエラーは同じではありません。-qは出力を抑えて存在判定に使いますが、一致を見つけるとエラーがあっても0となる場合があるため、通常モードの規則を無条件に当てはめません。

実習と安全な再現 専用の空ディレクトリに上記のテキストだけを作り、まず内容と行番号を確認します。検索パターンは単一引用符で囲み、*や$などをシェルに展開させずgrepへ渡します。-で始まるパターンはgrep -e '-error' FILEなどと明示します。既知の一致、無一致、存在しないファイルを別々に実行し、標準出力と終了ステータスを記録します。

図解

grepで何を選ぶか
表示形式を変えても、どの行を選んだかを先に考える。

重要ポイント

  • 通常は部分一致した行全体を選ぶ。
  • -Fは固定文字列、-Eは拡張正規表現。
  • ^と$は行の端、-xは行全体の一致。
  • -cは一致行数であり出現回数ではない。

間違えやすい点

  • -vを逆順と取り違えない。
  • 正規表現の.を常に文字の点だと思わない。
  • 終了1の無一致を読取り失敗と混同しない。
  • シェルの展開とgrepのパターン解釈を分ける。

用語解説

パターン
検索条件を表す文字列。
正規表現
文字列の形を記号の規則で表す方法。
固定文字列
正規表現の特殊な意味を付けずに扱う文字列。
選択行
パターンや反転条件などに従って出力対象となった行。
終了ステータス
コマンドが終了時に返す数値。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。