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

この記事の結論
- grepは行ごとに、合うかどうかを見るだけ
- 終わったときの番号は0=合った / 1=合わなかった / 2=エラー
- 「見つからない」と「失敗した」が別の番号になっている
- grepは行ごとに、合うかどうかを見るだけ
- 終わったときの番号は0=合った / 1=合わなかった / 2=エラー
- 「見つからない」と「失敗した」が別の番号になっている
ログを見るときに毎回使っているのに、仕組みを説明しろと言われると曖昧だった。整理したら、つまずいていた理由がはっきりした。

やっていることは1つだけ
grepは入力を1行ずつ読み、模様に合うかどうかを判定して、合った行を出す。それだけになる。
ファイル全体を理解しているわけではない。行をまたいだ条件は、素のgrepでは書けない。ここが最初の分かれ目になる。「エラーの次の行も見たい」と思ったら、模様を工夫するのではなく前後の行を出す指定を使う。
出し方を変える指定
指定は大きく2種類に分かれる。選び方が変わるものと、出すものが変わるものだ。
| 指定 | 変わるもの | 内容 |
|---|---|---|
-i | 選び方 | 大文字小文字を区別しない |
-v | 選び方 | 合わない行を出す(逆にする) |
-w | 選び方 | 単語として丸ごと合うものだけ |
-r | 選び方 | フォルダの中を順にたどる |
-n | 出すもの | 行番号を頭に付ける |
-c | 出すもの | 行ではなく件数を出す |
-l | 出すもの | 行ではなくファイル名を出す |
-o | 出すもの | 合った部分だけを出す |
-F | 解釈 | 模様ではなく文字そのものとして扱う |
-F は地味に効く。検索したい文字列に記号が入っているとき、模様として解釈されて意図しない結果になるのを防げる。
つまずいたのは番号のほう
手引きはこう書いている。
通常、終了ステータスは行が選ばれた場合は0、行が1つも選ばれなかった場合は1、エラーが起きた場合は2になる。
問題は1の意味だ。「見つからなかった」は、grepにとっては正常に終わった結果になる。ところが、手順を書く側から見ると1は失敗に見える。
何が起きるか
エラーが出たら止まる設定にした手順の中で、grepを「念のための確認」として置くと、問題が無かったときだけ手順が止まる。
直感と逆になる。異常が無いほうが落ちるので、原因を探しても見つからない。
対処は単純で、grepの結果をそのまま成否として扱わない。件数を数える形にするか、見つからなくても進むように受け止める。
-q を使うときの例外
静かに実行する指定を使った場合、手引きには行が選ばれたなら、エラーが起きていても0になると書かれている。
つまり-q のときの0は「エラーが無かった」を意味しない。有無だけを調べたいときには便利だが、エラーも一緒に確かめたいなら向かない。
模様の書き方は既定が古い
手引きには「既定では、grepは基本正規表現(BRE)を使う」とある。
基本のほうでは、まとめる括弧や「または」に逆斜線が要る。拡張のほうでは要らない。できることは同じでも、書き方が違う。
見慣れた書き方で動かないときは、だいたいこれが理由になる。迷ったら拡張の指定を付けるのが早い。
量が多いときに絞る順番
フォルダ全体をたどると、関係の無いファイルまで読む。絞る順番を決めておくと、結果が見やすくなる。
- ファイルを絞る — 名前の形を指定して、対象そのものを減らす
- 件数を見る — 先に規模を知る。多すぎるなら条件を見直す
- ファイル名だけ出す — どこにあるかを先に掴む
- 行を見る — 行番号を付けて、前後も一緒に出す
いきなり4番目から始めると、画面が流れて何も残らない。広いところから狭めていくほうが早い。
記号が入るときは模様として解釈させない
探したい文字列に . や [ や * が入っていると、模様として解釈されて意図しない行まで合う。IPアドレスやファイルのパスを探すときに起きやすい。
このとき逃がす記号を一つずつ書くより、文字そのものとして扱う指定を付けるほうが確実になる。模様が要らないなら、模様として解釈させない。
侵害を調べるときに使う
不正アクセスの「侵害の確認」で最初にやるのが、ログの抽出になる。
このとき件数を先に数える。行をいきなり出すと量に流されるので、-c で規模を見てから中身を見る。0件だったときに番号1が返ることも、ここで効いてくる。
まとめ
- grepは行ごとに、合うかどうかを見て、合った行を出すだけ
- 行をまたいだ条件は書けない。前後の行は専用の指定で出す
- 指定は選び方が変わるものと出すものが変わるものに分かれる
- 終了ステータスは0=合った / 1=合わなかった / 2=エラー
- 1を失敗として扱うと、問題が無いときだけ手順が止まる
- 模様の既定は基本正規表現。見慣れた書き方で動かないときはこれ
出典
- GNU Grep 公式マニュアル(終了ステータス、各指定の意味、既定が基本正規表現であること。2026年10月13日に確認)
図は本記事のために作成したもの。
新しい記事が出たら、ブラウザの通知でお知らせします。
メールアドレスの登録は要りません。いつでも止められます。
関連記事
RELATED
0.1 + 0.2 が 0.3 にならない理由を図にした
壊れているのではなく、10進で割り切れる数が2進では割り切れないためです。比較の仕方と、金額を扱うときの原則を整理しまし…
REST APIの考え方を図にした。URLに動詞を入れない
RESTは制約条件の集まりです。URLは物を指し、動作はメソッドで表します。RESTfulと呼ばれるAPIが必ずしも準拠…
層に分ける、という考え方を図にした。OSIの7層と、実際の4層
OSI参照モデルは7層ですが、実際に動いている仕様は4層で書かれています。層に分ける利点と、切り分けが決まる理由を整理し…