テキストの検索と絞り込み
grep・wc -l・head/tail・パイプ | の 4 つを組み合わせ、数万行のログファイルから必要な情報だけを 1 行で取り出せるようになります。
| 所要時間 | 約 25 分 |
|---|---|
| 章タイプ | standard |
| 前提知識 | Chapter 1(SSH)・Chapter 2(パス)・Chapter 3(cat / less / /var/log) |
| 使用機材 | 踏み台 workstation01 + 演習用サーバ learner01 |
| 関連章 | 前: Chapter 3「ファイルとディレクトリの基本操作」/ 後: Chapter 5「ファイルを書き換える(vim 入門)」 |
「目で探す」を卒業する
前の章で、あなたは /var/log/auth.log を less で開いて、自分自身が SSH ログインした記録を実際に見ました。G で末尾に飛び、矢印キーで遡って、「あ、これが私だ」という行を肉眼で見つけた ── ここまでは「読む」操作です。
ところが、本物のサーバはもっと喋ります。1 日動かすと /var/log/syslog は数千行から数万行に膨らみ、何かトラブルが起きたとき「どこかにエラーが書かれているはず」と分かっていても、目で探すのは現実的ではありません。
grep wc -l head / tail |(パイプ)この 4 つが手になじむと、10,000 行のログから 3 行だけ抜き出して、件数を数えて、最新の出来事だけ表示する ── すべて 1 行で書けるようになります。
この章を終えるとできること
テキストを絞り込む 基本動作 4 つ ── 探す・数える・切り出す・つなぐ ── を手に入れます。
必要な行だけ抜き出す
機械的に測る
必要な数行だけ
次のコマンドに渡す
この 4 つの真価は 「つなげたとき」 に出ます。「失敗ログインだけを抜き出して件数を数える」 ── これが 1 行で書けるようになる、というのが Ch4 のゴールです。
概念説明
1. テキスト絞り込みの「4 動作」
文字列を扱う操作は、考え方のうえでは 4 つに整理できます。この 4 つは個別にも使えますが、真価はつなげたときに出ます。
| 動作 | コマンド | 一言 |
|---|---|---|
| 探す | grep "パターン" ファイル | パターンを含む行だけ抜き出す |
| 数える | wc -l | 行数(件数)を測る |
| 切り出す | head / tail | 先頭・末尾の N 行を取る |
| つなぐ | |(パイプ) | 前のコマンドの出力を次に渡す |
2. 探す ── grep の基本
grep は 「パターンを含む行だけ抜き出す」 コマンドです。マッチしない行は表示されません。
grep "パターン" ファイル名 grep "student" /var/log/auth.log # student を含む行だけ表示
よく使うオプションは 4 つだけです。これだけで現場の調査の 8 割は済みます。
| オプション | 動作 |
|---|---|
-i | 大文字小文字を無視(Error / ERROR も拾う) |
-c | マッチした行数だけ表示(行そのものは出さない) |
-n | 行番号を付ける |
-v | マッチしない行を出す(反転) |
grep のパターンは正規表現ですが、まずは「ただの文字列マッチ」として使えれば十分です。. や * などの特殊文字は Part 1 では使いません。3. 数える ── wc -l
wc は word count の略で、-l(lines)を付けると 行数だけ を返します。wc -l 単独でファイルの行数を測れますが、真価は次の パイプ で分かります。
wc -l /var/log/auth.log # auth.log は何行あるか
4. つなぐ ── パイプ |
パイプ | は 「前のコマンドの出力を、次のコマンドの入力にする」 演算子です。水道のホースをつなぐイメージで、何本でも連結できます。
grep "Failed" /var/log/auth.log | wc -l # 「Failed を含む行を抜き出して、その行数を数える」── 失敗ログインの件数が一発で出る grep "student" /var/log/auth.log | grep "Accepted" | wc -l # 3 段つなぎ: student の成功ログイン件数
考え方は 「A の出力を B が受け取り、B の出力を C が受け取る」。途中でおかしくなったら、一段ずつ分解して結果を確認する のがコツです。
5. 切り出す ── head と tail
ログが何千行あっても、見たいのは 先頭の数行 か 末尾の数行 だけ、ということがよくあります。
head -n 5 ファイル名 # 先頭 5 行 tail -n 5 ファイル名 # 末尾 5 行 tail -n 20 /var/log/syslog # syslog の最新 20 行 tail -f /var/log/syslog # ★ 書き込まれる行をリアルタイム表示(Ctrl+C で終了)
-n を省略するとデフォルトで 10 行です。tail -f はサーバが今この瞬間に何を書いているか目の前で流れる、別格に便利な使い方で Part 7(監視と障害対応)で再登場します。
試してみよう:ログから「自分の足跡」を取り出す
この演習のシナリオ: 「数日後、サーバに何回ログインしたか思い出したい」 ── Ch3 で less で目視した内容を、今度は grep と | で機械的に絞り込んで数えます。実際の運用調査と同じ手順です。
この章の演習は すべて読み取り操作 です。ファイルの中身は一切変えません。rm も mv も使いません。何度実行しても安全です。
※ auth.log を読むには student が adm グループに入っている必要があります。演習環境では事前に設定済みなので、そのまま進めてください。グループの仕組みは Chapter 7 で詳しく学びます。
まず learner01 に入る
ssh student@learner01
まずファイルの全体規模を測る
auth.log が何行あるか、まず把握します。この量を目で読むのは現実的ではない ── これが grep の出番です。
wc -l /var/log/auth.log # 数百〜数千行あるはず
自分の名前で grep
自分(student)に関する行だけ抜き出します。先ほどの全体行数と比べると、ぐっと減っているはずです。
grep "student" /var/log/auth.log
成功ログインだけに絞り込む(パイプ初登場)
student の行の中から、さらに Accepted(ログイン成功)だけ抜き出します。パイプの初体験です。grep "student" の結果を、そのまま次の grep "Accepted" に渡しています。
grep "student" /var/log/auth.log | grep "Accepted"
件数を数える
③ の結果が何行あるか、wc -l で測ります。数えるために目で追う必要はもうありません。
grep "student" /var/log/auth.log | grep "Accepted" | wc -l # たとえば「3」と出れば、student の成功ログインは 3 回
失敗ログインを実機で起こして捕まえる
今度はわざと 間違ったパスワードでログインを試みます。「失敗のログがどう記録されるか」を、自分の手で起こして実機で確認します。
シミュレーターで「ありそうな失敗ログ」を見るのとは違います。あなたが今この瞬間に起こした失敗イベントが、サーバ自身の手で記録される瞬間を見にいきます。
exit # まず learner01 から workstation01 に戻る ssh student@learner01 # パスワードを 1〜2 回わざと間違える → Ctrl+C で中断 ssh student@learner01 # 今度は正しいパスワードで入る
learner01 に戻ったら、失敗ログインを grep で抜き出します。
grep "Failed password" /var/log/auth.log
... learner01 sshd[xxxx]: Failed password for student from 192.0.2.202 port xxxxx ssh2
最新の出来事だけ tail で見る
auth.log の末尾 10 行だけ取り出して、最新の動きを確認します。G でスクロールする必要はもうありません。
tail -n 10 /var/log/auth.log
応用として tail -f を試したい人は、別のターミナルで ssh student@learner01 を試してみてください。その記録が目の前にリアルタイムに流れます。Ctrl + C で抜けられます。
詰まったら
- 段階ヒント: 定番の詰まりポイントへの段階開示。1 段 → 2 段 → 答え、と少しずつ開けます
- AI に相談: Cloudflare Workers AI に自由質問できる相談窓口(v2 公開予定)
💡 軽く方向だけ
grep は「含む 行だけ抜き出す」、wc -l は「行数を数える」、| は「前の結果を次に渡す」── この 3 つだけ意識すれば組み立てられます。grep の結果を | wc -l につなげば、件数が出ます。
💡 具体的なコマンドの形
grep "パターン" ファイル # パターンを含む行 grep "A" ファイル | grep "B" # A も B も含む行 grep "A" ファイル | wc -l # A を含む行の件数 tail -n 5 ファイル # 末尾 5 行
grep "student" → grep "Accepted" → wc -l の順でつなぎます。途中でおかしくなったら パイプを一段ずつ外して結果を確認。
✅ 答えを見る
# 全体規模 wc -l /var/log/auth.log # 自分(student)の行だけ grep "student" /var/log/auth.log # 成功ログインの件数 grep "student" /var/log/auth.log | grep "Accepted" | wc -l # 失敗ログイン grep "Failed password" /var/log/auth.log # 最新 10 行 tail -n 10 /var/log/auth.log
ポイント: パイプは 左から右に「ホースをつなぐ」 イメージ。A | B | C は「A の出力を B に渡し、B の出力を C に渡す」。途中でおかしくなったら、一段ずつ分解して結果を確認する のがコツです。
AI に相談
修了確認
学んだことが身についたか、2 問だけ確認してみましょう。
grep -i "error" /var/log/sysloggrep -c "Failed" /var/log/auth.loggrep -v "DEBUG" app.log/var/log/auth.log から 「ユーザー alice が失敗したログインの件数」 を 1 行で求めるコマンドを書いてください(alice の失敗ログインだけを数える)。次の章へ
次は Chapter 5「ファイルを書き換える(vim 入門)」 です。
ここまで「読む」「探す」「絞り込む」までは身につきました。次の壁は 「ファイルを書き換える」 です。サーバの設定ファイルを編集するには、エディタが要ります ── そして Linux サーバの世界では、いまだに vim が事実上の標準です。
最初の数分は「終了の仕方が分からない」「カーソル移動できない」と誰もが詰まります。それを 「3 つのモード × 5 つのキー」だけで突破する のが次の章のゴールです。