【第2回】Linuxテキスト処理と検索の魔法!プロが駆使する grep / find / sed / awk 完全攻略

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
「Linuxエンジニアになるための基礎」連載、第2回にようこそ。前回はファイルやディレクトリの基本操作と権限管理について学びました。Linuxの土台となる「ファイルシステム」の構造はイメージできるようになりましたか?

今回は、インフラエンジニアの業務において最も重要かつ、最も時間を割くことになる「テキスト処理と検索の技術」について、圧倒的な情報量と深さで解説します。
Linuxの世界では、OSの設定からミドルウェアの動作状況、さらにはシステムのエラーに至るまで、すべてが「テキストファイル(ログ)」として記録されます。つまり、膨大なテキストデータから目的の情報を瞬時に抽出・加工・置換できるスキルこそが、障害復旧(トラブルシューティング)のスピードを決定づけるのです。

コウ君

先生……助けてください……。昨日、Webサーバー(Nginx)で障害が起きて、先輩に「アクセスログからエラーの原因になったIPアドレスとURLを特定して!」と言われたんですが、ログファイルが数GBもあって……。目で追うのは絶対に不可能だし、どうすればいいか途方に暮れています。

リナックス先生

コウ君、数GBのログを目視で探すなんて、砂漠で一粒の砂金を探すようなものよ!でも安心して。Linuxには、そんな広大なデータの海から数秒で真実を引き上げる「4つの魔法の杖(grep, find, sed, awk)」が最初から用意されているの。
今日は単なるコマンドの使い方ではなく、これらを「パイプ(|)」で繋ぎ合わせ、プロの現場で実際に使われている『ワンライナー(1行の強力なコマンド)』を構築する思考法まで徹底的に叩き込むわよ!

📚 本連載のカリキュラム(全8回)


    1. 📚 本連載のカリキュラム(全8回)
  1. 第1章:Linux哲学の核心「標準入出力とパイプ・リダイレクト」
    1. 1-1. ファイルディスクリプタ(0, 1, 2)の理解
    2. 1-2. リダイレクト(データの出力先を変更する)
    3. 1-3. パイプライン(|)によるコマンドの連結
  2. 第2章:grepコマンドの神髄 〜ログの海から真実を見つけ出す〜
    1. 2-1. 基本的な使い方と必須オプション
    2. 2-2. コンテキスト(前後行)の抽出
    3. 2-3. 正規表現(Regular Expression)の活用
  3. 第3章:findコマンドの極意 〜迷子のファイルを一瞬で特定し処理する〜
    1. 3-1. 多彩な検索条件(名前・種類・サイズ)
    2. 3-2. タイムスタンプ検索とセキュリティ監査への応用
    3. 3-3. 検索結果に対する一括処理(-exec と xargs の違い)
  4. 第4章:sedコマンドの魔術 〜テキストストリームの非対話型一括置換〜
    1. 4-1. 最もよく使う「文字列の置換 (sコマンド)」
    2. 4-2. -i オプションによるファイルの上書き保存とバックアップ
    3. 4-3. 正規表現の「後方参照」を用いた高度な置換
  5. 第5章:awkコマンドの究極 〜データ抽出と集計を極める最強言語〜
    1. 5-1. フィールドの抽出(列の切り出し)
    2. 5-2. 条件付きのアクション(if文のような制御)
    3. 5-3. 高度な集計(変数と演算の活用)
  6. 第6章:プロの障害調査!コマンドを組み合わせた最強のワンライナー実践
    1. 6-1. 【実戦】アクセスログから大量アクセスの送信元IP Top10を抽出する
  7. 総まとめ:ツールを組み合わせ、無限の可能性を手にする
    1. ▼ 【テキスト処理を自分の環境で叩き込もう】 ▼

第1章:Linux哲学の核心「標準入出力とパイプ・リダイレクト」

各コマンドの詳細に入る前に、Linuxにおける「データの流れ(ストリーム)」という概念を絶対に理解しなければなりません。この概念がないと、コマンド同士を組み合わせることは不可能です。

1-1. ファイルディスクリプタ(0, 1, 2)の理解

Linuxでは、実行されるプログラムに対して必ず3つのデータの通り道(ファイルディスクリプタ:FD)が用意されます。

  1. 標準入力(stdin / FD: 0):プログラムにデータを入れる口。通常はキーボード。
  2. 標準出力(stdout / FD: 1):プログラムが正常な結果を出す口。通常はディスプレイ画面。
  3. 標準エラー出力(stderr / FD: 2):プログラムがエラーメッセージを出す口。通常はディスプレイ画面。

1-2. リダイレクト(データの出力先を変更する)

デフォルトでは画面に出力される「標準出力」を、ファイルに書き込む技術が「リダイレクト」です。ログのバックアップや、スクリプトの実行結果を保存する際に必須となります。

# 画面に出るはずの実行結果を、新規ファイルに上書き保存する(>)
ls -la /var/log > log_list.txt

# 既存のファイルの末尾に、結果を追記する(>>)
echo "New Log Entry" >> log_list.txt

# 標準エラー出力(FD: 2)だけを別のファイルに保存する
find / -name "secret.txt" 2> error_log.txt

# 標準出力と標準エラー出力の両方を同じファイルに保存する(2>&1)
/usr/local/bin/my_script.sh > script.log 2>&1

⚠️ プロのテクニック:ブラックホール(/dev/null)への破棄
インフラ運用では、エラーメッセージが画面に大量に出力されるのを防ぎたい場面が多々あります。その際、2> /dev/null を使うことで、エラー出力をLinuxの「ゴミ箱(ブラックホール)」に捨て、正常な出力だけを抽出することが可能です。

1-3. パイプライン(|)によるコマンドの連結

パイプ(|)は、「左側のコマンドの標準出力を、右側のコマンドの標準入力として渡す」というLinux最大の魔法です。これにより、単機能のコマンドをレゴブロックのように繋ぎ合わせて、複雑な処理を実現します。

# コマンド1の出力をコマンド2に渡し、さらにコマンド3に渡す
コマンド1 | コマンド2 | コマンド3

この「パイプ」という強力な接着剤があることを前提に、以降のテキスト処理コマンド(grep, find, sed, awk)を解説していきます。


第2章:grepコマンドの神髄 〜ログの海から真実を見つけ出す〜

grep は「Global Regular Expression Print」の略で、ファイルの中から指定した文字列(または正規表現)に一致する行を抽出するコマンドです。障害調査において、エンジニアが最も叩くコマンドナンバーワンです。

2-1. 基本的な使い方と必須オプション

単なる文字列検索から、大文字小文字の区別をなくす、あるいは「含まれない行」を抽出するなど、オプション一つで挙動を劇的に変化させることができます。

# アクセスログから「404」という文字列を含む行だけを抽出する
grep "404" /var/log/nginx/access.log

# -i オプション:大文字・小文字を区別せずに検索(Error, error, ERRORすべてに一致)
grep -i "error" /var/log/messages

# -v オプション:指定した文字列が「含まれない」行を抽出(除外検索)
grep -v "127.0.0.1" /var/log/nginx/access.log

# -r オプション:指定したディレクトリ以下の全てのファイルを再帰的に検索する
grep -r "Database connection failed" /var/log/

2-2. コンテキスト(前後行)の抽出

エラーログを見つけた際、プロはその「エラー行」だけを見ません。「エラーが起きる直前に何が実行されていたか(原因)」、「エラーの直後にシステムがどうなったか(影響)」を知る必要があります。ここで活躍するのが -A, -B, -C オプションです。

# -A (After): エラー行と、その「後」の3行を表示
grep -A 3 "Critical" /var/log/secure

# -B (Before): エラー行と、その「前」の3行を表示
grep -B 3 "Critical" /var/log/secure

# -C (Context): エラー行と、その「前後」の3行ずつ(計7行)を表示
grep -C 3 "Critical" /var/log/secure

2-3. 正規表現(Regular Expression)の活用

grep の真の力は、検索条件をパターン化する「正規表現」を用いた時に発揮されます。AlmaLinuxなどモダンな環境では、より強力な拡張正規表現が使える grep -E(または egrep)を使うのがベストプラクティスです。

# 行頭(^)が「Failed」で始まる行を検索(SSHの認証失敗ログ抽出などに頻出)
grep "^Failed" /var/log/secure

# 行末($)が「.php」で終わる行を検索
grep "\.php$" access.log

# 「Error」または「Warning」のどちらかを含む行を検索(拡張正規表現のOR演算)
grep -E "Error|Warning" /var/log/messages
コウ君

なるほど!ログファイル全体を less コマンドで開いて目で探すんじゃなくて、まずは grep -E "Error|Warning" で危険な行だけをピンポイントに絞り出せばいいんですね。これなら数GBのログでも数秒で終わります!

リナックス先生

その通り!さらに高度なテクニックとして、巨大なファイルをgrepする際に処理速度が遅いと感じたら、環境変数を指定して LANG=C grep "検索文字" ファイル名 と打ってみて。言語の文字コード処理をスキップさせることで、検索速度が数十倍に跳ね上がるわ。これがプロのインフラエンジニアのパフォーマンスチューニングよ!


第3章:findコマンドの極意 〜迷子のファイルを一瞬で特定し処理する〜

サーバー内に散らばった数百万のファイルから、特定の条件(名前、サイズ、更新日時、権限)に合致するファイルを瞬時に見つけ出すのが find コマンドです。単なる検索だけでなく、「見つけたファイルに対してアクションを起こす」機能を持っている点が最強たる所以です。

3-1. 多彩な検索条件(名前・種類・サイズ)

# 基本:/var/log ディレクトリ配下から「.log」で終わるファイルを検索(大文字小文字区別)
find /var/log -name "*.log"

# -iname オプション:大文字小文字を無視して検索(.LOG や .Log もヒット)
find /var/www -iname "*.php"

# -type オプション:ファイル(f) または ディレクトリ(d) だけに絞り込む
find /etc -type d -name "nginx"

# -size オプション:ファイルサイズで検索(例:100MBより大きいファイルを特定。ディスク逼迫調査に必須)
find / -type f -size +100M

3-2. タイムスタンプ検索とセキュリティ監査への応用

システムが不正アクセスを受けたり、マルウェアに感染した疑いがある場合、インフラエンジニアは「最近作成・変更された不審なファイルはないか?」を真っ先に調査します。

# -mtime (Modify Time):過去7日以内に「内容が変更」されたファイルを検索
find /var/www/html -type f -mtime -7

# -mmin (Modify Minute):過去60分以内に変更されたファイルを検索
find /etc -type f -mmin -60

# パーミッション検索:誰でも読み書き実行可能な危険なファイル(777)を探し出す
find / -type f -perm 777 2> /dev/null

このように、find コマンドはトラブルシューティングのみならず、サーバーのセキュリティ監査やフォレンジック(インシデント後の証拠保全)においても極めて重要な役割を果たします。

3-3. 検索結果に対する一括処理(-exec と xargs の違い)

find で見つけたファイル群を一括で削除したり、権限を変更したりすることができます。ここで重要になるのがパフォーマンスです。

# パターン1:-exec オプションを使う方法(遅い)
# 見つかったファイル【1つずつ】に対してコマンド(chmod)を実行する
find /var/www/html -type f -name "*.sh" -exec chmod 755 {} \;

# パターン2:xargs にパイプで渡す方法(速い・プロ推奨)
# 見つかったファイルを【まとめて引数として展開し】一括でコマンドを実行する
find /var/www/html -type f -name "*.sh" | xargs chmod 755

⚠️ xargsの落とし穴と -print0 の重要性
ファイル名に「半角スペース」が含まれている場合、xargs はそこで文字列が途切れたと勘違いし、誤作動を起こします。プロの現場ではこの事故を防ぐため、find側で区切り文字をヌル文字にする -print0 と、xargs側でそれを受け取る -0 をセットで使うのが絶対の鉄則です。
例:find /path -type f -name "*.txt" -print0 | xargs -0 rm -f


第4章:sedコマンドの魔術 〜テキストストリームの非対話型一括置換〜

sed(Stream Editor)は、テキストデータを入力ストリームとして受け取り、指定されたルールに従って文字列の置換、削除、挿入を自動的に行うコマンドです。
エディタ(vimなど)を開いて手動で書き換える(対話型)のではなく、コマンドラインから一撃で処理(非対話型)できるため、Ansibleやシェルスクリプトを用いたインフラ自動化の心臓部となります。

4-1. 最もよく使う「文字列の置換 (sコマンド)」

書式は s/検索文字列/置換文字列/フラグ です。

# ファイル内の「apple」を「orange」に置換し、結果を標準出力(画面)に表示する
# ※gフラグがないと、その行で最初に見つけた1つしか置換しません。
sed 's/apple/orange/' fruits.txt

# gフラグを付与:ファイル内の「すべて」のappleをorangeに一括置換する(Global)
sed 's/apple/orange/g' fruits.txt

# dコマンドを用いた行の削除:行頭が「#」で始まる行(コメント行)をすべて削除して表示する
sed '/^#/d' /etc/ssh/sshd_config

4-2. -i オプションによるファイルの上書き保存とバックアップ

デフォルトでは sed の結果は画面に出力されるだけで、元のファイルは変更されません。元のファイルを直接書き換えたい場合は -i(in-place)オプションを使用します。

PR

Linuxカーネルプログラミング 第2版 [ Kaiwan N. Billimoria ]

価格:5720円
(2026/7/17 19:10時点)
感想(0件)

# /etc/ssh/sshd_config の Port 22 を Port 10022 に直接書き換える
sed -i 's/^Port 22/Port 10022/' /etc/ssh/sshd_config

⚠️ プロの自己防衛術:sed -i には必ず拡張子を指定する
sed -i は一歩間違えると設定ファイルを完全に破壊します。プロは必ず -i.bak のようにバックアップ用の拡張子を指定します。これにより、置換前の元ファイルを sshd_config.bak として自動生成しつつ、本体を上書き更新するため、設定ミスがあっても即座にロールバック(復旧)が可能です。
例:sed -i.bak 's/旧/新/g' file.conf

4-3. 正規表現の「後方参照」を用いた高度な置換

sed の強みは、検索した文字列の一部を「変数」のように保持し、置換文字列として再利用できる「後方参照(Backreference)」にあります。丸括弧 \( \) で囲んだ部分が記憶され、\1 や \2 で呼び出せます。

# IPアドレス(例: 192.168.1.100)の後ろに「- OK」という文字列を付け足す
# 検索条件の \(.*\) でIP全体をグループ化し、\1 に格納している。
echo "192.168.1.100" | sed 's/\(.*\)/\1 - OK/'
# 出力結果: 192.168.1.100 - OK

このように、設定ファイルの中で「値だけは動的に変えたいが、構文は維持したい」といった複雑な自動化スクリプトにおいて、後方参照は絶大な威力を発揮します。


第5章:awkコマンドの究極 〜データ抽出と集計を極める最強言語〜

grep が「行」を対象とするのに対し、awk(オーク)はスペースやカンマで区切られた「列(カラム)」の処理に特化したコマンドであり、もはやコマンドというより「データ処理に特化したプログラミング言語」です。
アクセスログやCSVファイルから特定のフィールドを抜き出したり、数値を足し算・平均化したりする集計処理において右に出るものはありません。

5-1. フィールドの抽出(列の切り出し)

awk はデフォルトで、空白(スペースやタブ)を区切り文字として認識します。1列目は $1、2列目は $2、そして行全体は $0 という組み込み変数に格納されます。

# ls -l の結果から、ファイルサイズ(5列目)とファイル名(9列目)だけを抽出する
ls -l | awk '{print $5, $9}'

# 区切り文字(Field Separator)をコロン(:)に変更する(-F オプション)
# /etc/passwdファイルから、ユーザー名(1列目)とログインシェル(7列目)を抽出
awk -F':' '{print $1, $7}' /etc/passwd

5-2. 条件付きのアクション(if文のような制御)

awk は、特定の条件に合致した行に対してのみアクションを実行することができます。書式は awk '条件 { アクション }' です。

# dfコマンド(ディスク使用量)の結果から、使用率(5列目)が80%以上の行を抽出する
# (※5列目の % 記号を無視して数値として比較している)
df -h | awk 'NR>1 && $5+0 >= 80 {print "Alert! Disk: " $1, "Usage: " $5}'

ここで登場した NR>1 は「行番号(Number of Record)が1より大きい」、つまりヘッダー行をスキップするというプロの実践的なテクニックです。

5-3. 高度な集計(変数と演算の活用)

NginxやApacheのアクセスログにおいて、「今日どれくらいの通信量(バイト数)が発生したか」を瞬時に計算することも可能です。

# Nginxのアクセスログの10列目(送信バイト数)をすべて足し合わせて、最後に合計を表示する
awk '{ sum += $10 } END { print "Total Bytes: " sum / 1024 / 1024 " MB" }' /var/log/nginx/access.log

Excelを開いて数万行のデータをインポートし、SUM関数を使うような作業が、Linuxのコマンドラインならわずか0.1秒で完了します。これがインフラエンジニアの圧倒的な生産性の正体です。


第6章:プロの障害調査!コマンドを組み合わせた最強のワンライナー実践

ここまで学んだコマンド(grep, awk)と、出力を並び替える sort、重複をカウントする uniq、先頭だけを表示する head コマンドをパイプで繋ぎ合わせ、実際の現場で多用される「最強のログ解析ワンライナー」を作成してみましょう。

コウ君

先生、サーバーの負荷が急上昇していて、どうやら特定のIPアドレスから大量のアクセス(DoS攻撃?)が来ているみたいなんです!アクセスログから、「最もアクセス回数が多いIPアドレスのTop 10」を出すにはどう組めばいいですか?

リナックス先生

任せて!これが、インフラエンジニアの伝家の宝刀、「アクセスログ解析の極意」よ。一つ一つのコマンドの役割をしっかり理解しながら繋いでいくわよ!

6-1. 【実戦】アクセスログから大量アクセスの送信元IP Top10を抽出する

以下のワンライナーを実行するだけで、攻撃者のIPアドレスがランキング形式で可視化されます。

# NginxのアクセスログからIPアドレスごとのアクセス回数ランキングトップ10を算出
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10

【ワンライナーの解剖と各コマンドの役割】

  1. awk '{print $1}' /var/log/nginx/access.log
    ログファイルの各行から「第1カラム(通常は送信元IPアドレス)」だけを切り出します。この時点で、IPアドレスだけのリストが流れてきます。
  2. sort
    抽出したIPアドレスをアルファベット(文字コード)順に綺麗に並べ替えます。これは次の uniq コマンドが「連続した同じ行」しか処理できないため、必須の準備作業です。
  3. uniq -c
    連続する同じIPアドレスを1行にまとめ(重複排除)、その左側に「出現回数(Count)」を付与します。
  4. sort -nr
    行頭に付与された「出現回数」を基準にして、数値として(-n: numeric)、大きい順・降順(-r: reverse)で並べ替えます。これでアクセスが多い順のランキングが完成します。
  5. head -n 10
    ランキング全体を表示すると画面が埋まってしまうため、上位10件だけを切り取って表示します。

攻撃者のIPが特定できたら、前回学んだファイアウォールの知識を使い、即座にそのIPアドレスからの通信を遮断(Drop)することで、インシデントを収束させることができます。これが、コマンドを駆使してシステムを守るエンジニアの戦い方です。


総まとめ:ツールを組み合わせ、無限の可能性を手にする

連載第2回「テキスト処理と検索の魔法」、お疲れ様でした!今回の内容は非常にボリュームがあり、高度な概念も含まれていましたが、インフラエンジニアとして一生使える最も価値のあるスキルです。

振り返りとして、各コマンドの得意領域を整理しておきましょう。

  • パイプ(|)とリダイレクト(>): すべてのコマンドを繋ぎ合わせ、データの終着点を制御する接着剤。
  • grep: 行単位の抽出。ログの海から目的のキーワード(エラーや警告)を瞬時に釣り上げるルアー。
  • find: サーバー全体のファイル探索。タイムスタンプや権限条件で、迷子や危険なファイルを炙り出すレーダー。
  • sed: 行単位の自動置換。対話操作なしに設定ファイルを一括で書き換える自動化の要。
  • awk: 列(カラム)単位の処理と集計。アクセス数や通信容量を瞬時に計算するデータアナリスト。

LinuxというOSは、一つ一つのコマンドは「単一の事だけをうまくやる(Do one thing and do it well)」という哲学で作られています。それらをパイプで繋ぐことで、数百万行のログ解析から高度なセキュリティ監視まで、どんな複雑な処理も可能になります。

最初はコマンドのオプションを全て覚える必要はありません。「こんなことができたはずだ」という引き出しを持っておくことが大切です。分からなければ、その都度マニュアル(man grepなど)やWebで調べれば良いのです。

次回、第3回は「パッケージ管理の完全理解(apt / dnf / yum)」です。AlmaLinux環境で必須となる dnf コマンドを中心に、ミドルウェアのインストールやアップデート、依存関係の解決方法について深く掘り下げていきます。お楽しみに!リナックス先生でした!

▼ 【テキスト処理を自分の環境で叩き込もう】 ▼

【自由に壊せる自分だけのLinux環境】
「高コスパおすすめVPS」

VPSランキングを見る

【ログ解析スキルを武器にステップアップ】
「ITエンジニア専門転職」

転職エージェントを見る

コメント