前の記事では、find で「ファイル」を探しました。今回は、ファイルの中身から、目的の1行を探し出す番です。
自動化のスクリプトが止まったとき、まず見るのはログです。でも、ログは何百行、何千行と続いていて、上から順番に読んでいくのは大変ですよね。私も最初は less でひたすらスクロールしていました。grep を覚えてからは、「ERROR の行だけ出して」と1行打つだけで、原因の行にすぐたどり着けるようになりました。
この記事では、練習用のログを作って、grep で行を探す・数える・除く方法を一緒に試していきます。
-
grepで、指定した文字を含む行だけを表示する方法 - よく使うオプション(
-i・-n・-v・-c・-r) - 「ERROR か WARN」のように、いくつかの文字で探す方法
- 設定ファイルから、コメントを除いた行だけを見る方法
-
cat・less・tailでファイルの中身を見られる - ワイルドカードと
findの基本がわかる
まだの方は、前の記事「Linuxのワイルドカードとfind|大量のファイルから目的の1つを探す【初心者向け】」から読むのがおすすめです。
- IPアドレス:ネットワーク上のコンピューターの住所にあたる番号
- スクリプト:やりたい処理を順番に書いておき、まとめて実行できるファイル(小さなプログラム)
- ログ:プログラムが残す「いつ、何が起きたか」の記録
- ワイルドカード:ファイル名をまとめて指定するための記号。
*は「何文字でも」、?は「1文字だけ」を表し、シェルが当てはまるファイル名に置きかえます
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:grep は「探したい文字」と「ファイル」を渡すだけ
- 1
grep 探したい文字 ファイル名| やりたいこと | 書き方の例 |
|---|---|
| ERROR を含む行を表示 | grep ERROR app.log |
| 大文字・小文字を区別しない | grep -i error app.log |
| 行番号もつける | grep -n ERROR app.log |
| 含まない行を表示 | grep -v INFO app.log |
| 何行あるか数える | grep -c ERROR app.log |
| ディレクトリの中を全部探す | grep -r ERROR logs |
| どちらかを含む行 | grep -E を使う(このあと説明) |
準備:練習用のログを作る
練習は ~/linux-practice/grep-test の中で行います。次のコマンドで、自動化のログをまねたファイルを作ります。少し長いので、まとめてコピーして貼り付けてください。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
mkdir -p ~/linux-practice/grep-test/logs
cd ~/linux-practice/grep-test
printf '%s\n' \
"2026-07-30 09:00:01 INFO 処理を開始しました" \
"2026-07-30 09:00:02 INFO CSVを読み込みました sales.csv" \
"2026-07-30 09:00:03 WARN 列名がそろっていません 売上" \
"2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv" \
"2026-07-30 09:00:05 INFO 通知を送りました" \
"2026-07-30 09:00:06 error 再試行に失敗しました" \
"2026-07-30 09:00:07 INFO 処理が終わりました" > app.log
cat app.logここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
kaito@demo:~/linux-practice/find-test$ mkdir -p ~/linux-practice/grep-test/logs
cd ~/linux-practice/grep-test
printf '%s\n' \
"2026-07-30 09:00:01 INFO 処理を開始しました" \
"2026-07-30 09:00:02 INFO CSVを読み込みました sales.csv" \
"2026-07-30 09:00:03 WARN 列名がそろっていません 売上" \
"2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv" \
"2026-07-30 09:00:05 INFO 通知を送りました" \
"2026-07-30 09:00:06 error 再試行に失敗しました" \
"2026-07-30 09:00:07 INFO 処理が終わりました" > app.log
cat app.log
2026-07-30 09:00:01 INFO 処理を開始しました
2026-07-30 09:00:02 INFO CSVを読み込みました sales.csv
2026-07-30 09:00:03 WARN 列名がそろっていません 売上
2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv
2026-07-30 09:00:05 INFO 通知を送りました
2026-07-30 09:00:06 error 再試行に失敗しました
2026-07-30 09:00:07 INFO 処理が終わりました貼り付けた行がそのまま表示されたあと、cat app.log の結果として7行が表示されました。
printf '%s\n' は、そのあとに並べた文字を、1つずつ改行しながら書き出すコマンドです。行の最後の \ は「コマンドが次の行に続く」という意味です。
基本:指定した文字を含む行を表示する
- 1
grep ERROR app.log(例)
- 1
2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv今回の Debian 13 では、ERROR の文字に色はつきませんでした。type grep で確かめると、次のように表示されます。
(例)
- 1
- 2
kaito@demo:~/linux-practice/grep-test$ type grep
grep is hashed (/usr/bin/grep)これは「grep は /usr/bin/grep をそのまま使っています」という意味で、色をつける設定(alias。コマンドに別の書き方を登録するしくみ)は入っていません。Debian で新しく作ったユーザーの設定ファイル(~/.bashrc)では、色をつける行が「#」で無効になっているためです。環境によっては、最初から色をつける設定が入っていて、見つかった文字が赤などの色で表示されます。色があってもなくても、表示される行は同じです。
7行のうち、ERROR を含む1行だけが表示されました。でも、よく見ると app.log には小文字の error の行もありましたよね。
よく使うオプション
-i:大文字と小文字を区別しない
- 1
grep -i error app.log(例)
- 1
- 2
2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv
2026-07-30 09:00:06 error 再試行に失敗しましたgrep は、ふつうは大文字と小文字を区別します。ログの書き方がばらばらなときは、-i をつけておくと見落としが減ります。
-n:行番号をつける
- 1
grep -n -i error app.log(例)
- 1
- 2
4:2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv
6:2026-07-30 09:00:06 error 再試行に失敗しました行番号がわかると、「4行目の前後を見てみよう」と、less や nano で開いたときに探しやすくなります。
-A・-B・-C:前後の行もいっしょに見る
実は、前後の行は grep だけでも見られます。エラーの原因は、エラーの行そのものより、その直前の行に書かれていることがよくあります。
| オプション | 意味 | 覚え方 |
|---|---|---|
-A 1 | 見つかった行と、その後ろ1行 | After(あと) |
-B 1 | 見つかった行と、その前1行 | Before(まえ) |
-C 1 | 見つかった行と、前後1行ずつ | Context(まわり) |
たとえば grep -n -C 1 ERROR app.log と打つと、4行目の ERROR の行に加えて、3行目の WARN 列名がそろっていません と5行目の INFO 通知を送りました も表示されます。行番号のあとの記号が、見つかった行は 4:、前後の行は 3-・5- のように変わるので、どれが本命の行かも見分けられます。「ERROR の直前に、列名の WARN が出ていた」とわかれば、原因の見当がつけやすくなりますね。数字を 2 や 3 に増やせば、見る行も増えます。
-v:含まない行を表示する
- 1
grep -v INFO app.log(例)
- 1
- 2
- 3
2026-07-30 09:00:03 WARN 列名がそろっていません 売上
2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv
2026-07-30 09:00:06 error 再試行に失敗しましたふだんのお知らせ(INFO)を除くと、気にするべき行だけが残ります。
-c:何行あるか数える
- 1
- 2
grep -c INFO app.log
grep -c -i error app.log(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/grep-test$ grep -c INFO app.log
4
kaito@demo:~/linux-practice/grep-test$ grep -c -i error app.log
2「今日はエラーが何回出た?」をすぐに数えられます。毎日の自動化の結果をチェックするのに便利です。
-r:ディレクトリの中をまとめて探す
ログが何ファイルにも分かれているときは、-r でディレクトリの中をまとめて探せます。
- 1
- 2
- 3
echo "2026-07-29 09:00:04 ERROR 接続できませんでした" > logs/old.log
echo "2026-07-31 09:00:01 INFO 処理を開始しました" > logs/new.log
grep -r ERROR .(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~/linux-practice/grep-test$ echo "2026-07-29 09:00:04 ERROR 接続できませんでした" > logs/old.log
kaito@demo:~/linux-practice/grep-test$ echo "2026-07-31 09:00:01 INFO 処理を開始しました" > logs/new.log
kaito@demo:~/linux-practice/grep-test$ grep -r ERROR .
./logs/old.log:2026-07-29 09:00:04 ERROR 接続できませんでした
./app.log:2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv今回は ./logs/old.log が先、./app.log があとに表示されました。-r で探す順番は、名前の順とは限りません。
どのファイルの行なのかが、行の頭に表示されます。
いくつかの文字で探す:-E と |
「ERROR か WARN のどちらか」を含む行を探したいときは、-E をつけて、|(縦棒)で区切ります。
- 1
grep -E "ERROR|WARN" app.log(例)
- 1
- 2
2026-07-30 09:00:03 WARN 列名がそろっていません 売上
2026-07-30 09:00:04 ERROR ファイルが見つかりません report.csv探したい文字にスペースや |・* などの記号が入るときは、必ず "(ダブルクォート)で囲みましょう。囲まないと、シェル(=打ったコマンドを読み取って、プログラムを動かし、結果を返してくれるプログラム)が記号を別の意味に受け取ってしまいます。たとえば grep "見つかりません" app.log のように、日本語もそのまま探せます。
設定ファイルから、コメントを除いて読む
設定ファイルには、# で始まる説明(コメント)がたくさん書かれていることがあります。本当に効いている設定だけを見たいときは、-v と組み合わせます。練習用の設定ファイルで試してみましょう。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
printf '%s\n' \
"# 練習用の設定ファイル(ダミー)" \
"# 通知の時刻" \
"notify_time=09:00" \
"" \
"# 出力先" \
"output_dir=/home/kaito/reports" > sample.conf
grep -v "^#" sample.conf(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
kaito@demo:~/linux-practice/grep-test$ printf '%s\n' \
"# 練習用の設定ファイル(ダミー)" \
"# 通知の時刻" \
"notify_time=09:00" \
"" \
"# 出力先" \
"output_dir=/home/kaito/reports" > sample.conf
grep -v "^#" sample.conf
notify_time=09:00
output_dir=/home/kaito/reportsnotify_time=09:00 と output_dir=… のあいだに、空の行が1行残っています。
^ は「行の頭」という意味です。"^#" で「# で始まる行」を表し、-v でそれを除いています。空の行も消したいときは、grep -v "^#" sample.conf | grep -v "^$" のように、|(パイプ)でもう一度 grep にかけます。$ は「行の終わり」なので、"^$" は「何も書かれていない行」という意味です。
- 1
grep -v "^#" sample.conf | grep -v "^$"(例)
- 1
- 2
notify_time=09:00
output_dir=/home/kaito/reportsパイプ(|)は、「前のコマンドの結果を、次のコマンドに渡す」しくみです。次の記事でくわしく見ていきます。
システムのファイルからも探してみる
自分のファイルだけでなく、システムのファイルから探すこともできます。たとえば、使っている Linux の名前だけを取り出してみましょう。
- 1
grep PRETTY_NAME /etc/os-release(例)
- 1
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"さっき覚えたパイプを使うと、「前に打ったコマンドの中から、apt(=Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具)を使ったものだけ」を探すこともできます。
- 1
history | grep apt(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
82 sudo apt update
84 apt search tree
85 apt show tree
86 sudo apt install tree
88 sudo apt update
89 apt list --upgradable
90 sudo apt upgrade
91 sudo apt remove tree
92 sudo apt install no-such-package-demo
138 history | grep apt左の数字は、history の番号です(番号は、それまでに打ったコマンドの数によって変わります)。最後の行には、今打った history | grep apt 自身も出ています。このコマンドにも「apt」という文字が入っているからです。
🤖 詰まったらAIに聞こう:ログから原因の行を探したい
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Linuxの初心者です。ログから、エラーの原因になっている行を探したいです。
grep を使った探し方を、オプションの意味つきで教えてください。
見つかった行の意味も、わかる範囲で説明してください。
【使っている環境】WSLのUbuntu など
【ログのファイルの場所】例:~/linux-practice/grep-test/app.log
【探したいもの】例:エラーの行と、その前後の行
【試したコマンド】ここに貼る
【見つかった行(秘密情報は***に置き換え済み)】ここに貼るログには、APIキー、トークン、パスワード、メールアドレス、IPアドレスなどがそのまま書き出されていることがあります。APIキーやトークンは、Web のサービスを使うときに本人の代わりになる、合言葉のような文字列です。grep で見つけた行を AI に貼る前に、必ず見直して「***」に置き換えてください。たとえば grep -i key や grep -i token で探して、貼る前に気づけるようにしておくのも手です。
よくある質問
Q. INFO で探したら、INFORMATION のような長い単語の行まで出てきました。
grep は「その文字を含む行」を探すので、単語の一部に入っていても見つかります。単語として一致する行だけにしたいときは、grep -w INFO app.log のように -w をつけます。
Q. sales.csv で探したら、関係ない行まで出てきました。
grep では、.(ピリオド)が「どんな1文字でも」という特別な意味になるため、sales.csv は salesXcsv のような行にも当てはまります。書いたとおりの文字で探したいときは、grep -F sales.csv app.log のように -F をつけると、特別な意味なしで探せます。
Q. 日本語の文字でも探せますか?
探せます。たとえば grep 列名 app.log で、列名がそろっていません の行が見つかります。日本語のログでも、使い方は同じです。
まとめ
-
grep 探したい文字 ファイルで、その文字を含む行だけを表示できる -
-iは大文字小文字を区別しない、-nは行番号、-vは含まない行、-cは数える、-rはディレクトリの中をまとめて - 「どちらか」は
grep -E "ERROR|WARN" - 探したい文字は
"で囲む。^は行の頭、$は行の終わり -
|(パイプ)で、ほかのコマンドの結果からも探せる
次の記事では、ここで少しだけ使った |(パイプ)と、>・>>・2>&1 などのリダイレクトを、図を使って整理します。
次に読む記事
関連する記事
- Pythonで毎朝のCSV集計を自動化する(pandas+定期実行):定期実行した自動化のログを、grep でチェックしたい方に
- Cursorにエラーを直してもらう5ステップ|エラーの渡し方・頼み方・直った後の確認まで:grep で見つけたエラーの行を、AI に上手に渡したい方に
- n8nとは?最初のワークフローを1本つくる:ログのチェックや通知を、ノーコードで自動化してみたい方に