文字列検索 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 行も表示 |
動作の図解
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 processgrep 自身がプロセス一覧に出ないようにするには、grep -v grep を続けるか、grep [n]ginx のようなテクニックを使います。
単語一致と再帰検索
ターミナル
$ grep -w main src/main.c
int main(void) {-w を付けると domain や mainboard のような部分一致を除外できます。プロジェクト全体を検索したいときは -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 つができることを確認しましょう。
- grep の基本 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. grep の基本 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- echo でテストデータを作る
- grep -i を使う
- ERROR と error の行を 2 行抽出する