Linuxのgrep入門|ログや設定ファイルから1行を探し出す【初心者向け】

前の記事では、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 を使う(このあと説明)

grep のしくみ

準備:練習用のログを作る

練習は ~/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での実行画面

今回の 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/reports

notify_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
【探したいもの】例:エラーの行と、その前後の行
【試したコマンド】ここに貼る
【見つかった行(秘密情報は***に置き換え済み)】ここに貼る

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

ログには、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 などのリダイレクトを、図を使って整理します。


次に読む記事


関連する記事