grepは行ごとに見ているだけ。終わったときの番号でつまずいた

grepが何をしているのかを図にしました。見つからなかったときに返る番号が1で、手順の中で使うと止まります。

この記事の結論

  1. grepは行ごとに、合うかどうかを見るだけ
  2. 終わったときの番号は0=合った / 1=合わなかった / 2=エラー
  3. 「見つからない」と「失敗した」が別の番号になっている
  • grepは行ごとに、合うかどうかを見るだけ
  • 終わったときの番号は0=合った / 1=合わなかった / 2=エラー
  • 「見つからない」と「失敗した」が別の番号になっている

ログを見るときに毎回使っているのに、仕組みを説明しろと言われると曖昧だった。整理したら、つまずいていた理由がはっきりした。

ログの各行のうち条件に合う行だけが選ばれる様子と、主なオプションの一覧、終了ステータス3種類を整理した図
図1:合った行を出す。それ以上のことはしない。

やっていることは1つだけ

grepは入力を1行ずつ読み、模様に合うかどうかを判定して、合った行を出す。それだけになる。

ファイル全体を理解しているわけではない。行をまたいだ条件は、素のgrepでは書けない。ここが最初の分かれ目になる。「エラーの次の行も見たい」と思ったら、模様を工夫するのではなく前後の行を出す指定を使う。

出し方を変える指定

指定は大きく2種類に分かれる。選び方が変わるものと、出すものが変わるものだ。

指定変わるもの内容
-i選び方大文字小文字を区別しない
-v選び方合わない行を出す(逆にする)
-w選び方単語として丸ごと合うものだけ
-r選び方フォルダの中を順にたどる
-n出すもの行番号を頭に付ける
-c出すもの行ではなく件数を出す
-l出すもの行ではなくファイル名を出す
-o出すもの合った部分だけを出す
-F解釈模様ではなく文字そのものとして扱う

-F は地味に効く。検索したい文字列に記号が入っているとき、模様として解釈されて意図しない結果になるのを防げる。

SPONSORED

つまずいたのは番号のほう

手引きはこう書いている。

通常、終了ステータスは行が選ばれた場合は0、行が1つも選ばれなかった場合は1、エラーが起きた場合は2になる。

問題は1の意味だ。「見つからなかった」は、grepにとっては正常に終わった結果になる。ところが、手順を書く側から見ると1は失敗に見える。

何が起きるか

エラーが出たら止まる設定にした手順の中で、grepを「念のための確認」として置くと、問題が無かったときだけ手順が止まる。

直感と逆になる。異常が無いほうが落ちるので、原因を探しても見つからない。

対処は単純で、grepの結果をそのまま成否として扱わない。件数を数える形にするか、見つからなくても進むように受け止める。

-q を使うときの例外

静かに実行する指定を使った場合、手引きには行が選ばれたなら、エラーが起きていても0になると書かれている。

つまり-q のときの0は「エラーが無かった」を意味しない。有無だけを調べたいときには便利だが、エラーも一緒に確かめたいなら向かない。

模様の書き方は既定が古い

手引きには「既定では、grepは基本正規表現(BRE)を使う」とある。

基本のほうでは、まとめる括弧や「または」に逆斜線が要る。拡張のほうでは要らない。できることは同じでも、書き方が違う。

見慣れた書き方で動かないときは、だいたいこれが理由になる。迷ったら拡張の指定を付けるのが早い。

量が多いときに絞る順番

フォルダ全体をたどると、関係の無いファイルまで読む。絞る順番を決めておくと、結果が見やすくなる。

  1. ファイルを絞る — 名前の形を指定して、対象そのものを減らす
  2. 件数を見る — 先に規模を知る。多すぎるなら条件を見直す
  3. ファイル名だけ出す — どこにあるかを先に掴む
  4. 行を見る — 行番号を付けて、前後も一緒に出す

いきなり4番目から始めると、画面が流れて何も残らない。広いところから狭めていくほうが早い。

記号が入るときは模様として解釈させない

探したい文字列に . や [ や * が入っていると、模様として解釈されて意図しない行まで合う。IPアドレスやファイルのパスを探すときに起きやすい。

このとき逃がす記号を一つずつ書くより、文字そのものとして扱う指定を付けるほうが確実になる。模様が要らないなら、模様として解釈させない。

侵害を調べるときに使う

不正アクセスの「侵害の確認」で最初にやるのが、ログの抽出になる。

このとき件数を先に数える。行をいきなり出すと量に流されるので、-c で規模を見てから中身を見る。0件だったときに番号1が返ることも、ここで効いてくる。

まとめ

  • grepは行ごとに、合うかどうかを見て、合った行を出すだけ
  • 行をまたいだ条件は書けない。前後の行は専用の指定で出す
  • 指定は選び方が変わるものと出すものが変わるものに分かれる
  • 終了ステータスは0=合った / 1=合わなかった / 2=エラー
  • 1を失敗として扱うと、問題が無いときだけ手順が止まる
  • 模様の既定は基本正規表現。見慣れた書き方で動かないときはこれ
SPONSORED

出典

  • GNU Grep 公式マニュアル(終了ステータス、各指定の意味、既定が基本正規表現であること。2026年10月13日に確認)

図は本記事のために作成したもの。

新しい記事が出たら、ブラウザの通知でお知らせします。

メールアドレスの登録は要りません。いつでも止められます。

AUTHOR

北海道のWEB屋

北海道を拠点に、Web業界14年・サポート実績1,000件以上。WordPressの復旧、サーバー移転、独自ドメインとメールの設定、PHP・JavaScriptの修正まで対応します。相談と見積もりは無料です。

SPONSORED

関連記事

RELATED