文字列検索 grep

このレッスンで分かること

  • grep はテキストからパターン一致行を出力する、Linux 文化の中心コマンド
  • -i (大文字無視) -v (否定) -n (行番号) -r (再帰) は必修オプション
  • -A -B -C で前後の文脈を表示、-q でシェル条件分岐に使える

文字列検索 grep とは

grepコマンドを使って、ファイルから特定の文字列を検索する方法を習得します。本レッスンでは、文字列検索 grep の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

grep はテキストから特定のパターンを含む行を取り出すコマンドです。Linux で日々発生する作業のうち、ログから特定のエラーを探す、設定ファイルから該当行を抜き出す、git の出力からブランチ名を絞り込む、といった操作のほぼすべてに grep が登場します。「とりあえずパイプして grep」と言われるくらい、Linux 文化の中心にあるツールです。

名前は g/re/p (global / regular expression / print) の略で、もとは ed エディタの内部コマンドが元になっています。50 年以上前の道具が現役で使われ続けているという事実が、その有用性を物語っています。

基本構文

ターミナル

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

パターンを引数で渡し、ファイルから一致する行を出力します。ファイルを省略すると標準入力から読み込むので、パイプとの相性が非常に良いコマンドです。

主要オプション

オプション役割
-i大文字小文字を区別しない
-vパターンに一致しない行を表示
-n行番号を付ける
-c一致した行数だけ表示
-l一致したファイル名だけ表示
-r / -Rディレクトリを再帰的に検索
-w単語単位で一致
-A N / -B N / -C N一致行の後 / 前 / 前後 N 行も表示

動作の図解

diagram (will load when visible)

grep は行ごとに評価し、パターンに一致する行だけを出口に送ります。

代表例

単純なファイル検索です。

ターミナル

$ grep error /var/log/syslog Jan 1 10:00:01 host app[123]: error connect failed Jan 1 10:00:05 host app[123]: error timeout 5s

大文字小文字を無視する -i、否定の -v、行番号を付ける -n を組み合わせると、ログ調査の効率が大きく上がります。

ターミナル

$ grep -in warning /tmp/app.log 3:WARNING disk almost full 8:WARNING memory pressure

パイプとの組み合わせ

標準入力を受け取れるため、他のコマンドと組み合わせやすいのが特長です。

ターミナル

$ ps aux | grep nginx www-data 123 0.0 nginx: worker process www-data 124 0.0 nginx: worker process

grep 自身がプロセス一覧に出ないようにするには、grep -v grep を続けるか、grep [n]ginx のようなテクニックを使います。

単語一致と再帰検索

ターミナル

$ grep -w main src/main.c int main(void) {

-w を付けると domainmainboard のような部分一致を除外できます。プロジェクト全体を検索したいときは -r を使います。

ターミナル

$ grep -rn TODO src/ src/app.c:10:// TODO refactor src/utils.c:42:// TODO add tests

ファイル内の検索結果が多いときは grep ... | head -5 のように後段で件数を絞ると、画面が流れ切らずに済みます。

カウントと存在チェック

-c は一致行数だけを返すので、件数の把握に便利です。

ターミナル

$ grep -c ERROR /tmp/app.log 23

また、シェルスクリプトでは終了ステータス (0 が一致あり、1 が一致なし) を利用して、条件分岐に使うこともできます。

ターミナル

if grep -q ERROR /tmp/app.log; then echo "errors found" fi

-q は静音モードで、出力を捨てて終了ステータスだけ返します。

grep -v は「マッチしないものを残す」ので、コメント行や空行を取り除く前処理によく使われます。たとえば grep -v '^#' config | grep -v '^$' で「コメント行と空行を除いた本文」が得られます。

やってみよう

演習では echo で複数行のテキストを作り、grep で特定の単語を含む行を抜き出します。-i-v の挙動も試してみましょう。

前後の行を表示する -A / -B / -C

エラー行だけ見ても原因が分からない場合、前後の文脈が手掛かりになります。

ターミナル

$ grep -C2 ERROR /tmp/app.log INFO request received INFO processing 5 items ERROR connect failed INFO retry in 5s INFO ok

-A2 は後 2 行、-B2 は前 2 行、-C2 は前後 2 行ずつです。ログ調査で最も使うオプション群の 1 つです。

オプション意味
-A 2一致行の後 2 行エラー後のリトライ確認
-B 2一致行の前 2 行エラー前の処理内容確認
-C 2前後 2 行ずつ文脈全体を見る

ファイル名と除外

複数ファイルを指定すると、自動的に「ファイル名: 行」の形で表示されます。

ターミナル

$ grep ERROR *.log app.log:ERROR connect failed db.log:ERROR query timeout

特定のディレクトリを除外したいときは --exclude-dir を使います。

ターミナル

$ grep -r TODO --exclude-dir=node_modules src/

ビルド成果物や依存ライブラリのディレクトリを除くだけで、ヒット数が劇的に減ります。

この章のポイント

ここまでの要点 grep は行単位のパターンマッチ。-i -v -n -c は必修、-r でディレクトリ再帰、--exclude-dir で除外。-A -B -C で前後文脈、-q でシェル条件分岐。grep -v grep で grep 自身除外。

まとめ

  • grep はパイプ前後で最も使われる検索コマンド
  • -i -v -n -c は最低限覚えると効率が上がる
  • -r でディレクトリ丸ごと検索、--exclude-dir で除外
  • -A -B -C で前後の文脈を確認できる
  • -q を使えばシェルスクリプトの条件分岐にも使える

次のレッスン

次は 正規表現入門 で、grepコマンドを使って、ファイルから特定の文字列を検索する方法を習得します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. grep の基本 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. grep の基本 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo でテストデータを作る
  2. grep -i を使う
  3. ERROR と error の行を 2 行抽出する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力