Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

実践編:テキスト処理ツール(grep, sed, awk)の活用

Unix 環境における3大テキスト処理ツール(grep による検索、sed による置換・編集、awk による列抽出と集計)の特徴と連携手法を解説します。

3大ツールの役割分担

テキストストリームを加工・分析する際、目的に応じて最適なツールを使い分けます。

ツール主な役割代表的な処理
grepパターン検索・抽出特定の単語や正規表現を含む行の絞り込み
sed文字列置換・行編集設定ファイルの書き換え、不要な行の削除
awk列抽出・計算・レポートCSV や TSV の特定カラム抽出、数値の合計・平均

grep によるパターン検索

テキストから条件に合致する行を素早く検索・抽出します。

» 主要なオプション

# 大文字・小文字を区別せずに検索(-i)
grep -i "error" app.log

# 一致しない行を抽出(除外検索: -v)
grep -v "^#" config.conf  # コメント行を除外

# 一致した行数のみをカウント(-c)
grep -c "TIMEOUT" access.log

# 拡張正規表現を使用(-E または egrep)
grep -E "(FATAL|CRITICAL)" system.log

# ディレクトリ配下を再帰的に検索(-r)
grep -rn "TODO" ./src/

sed によるストリーム編集と置換

ファイルの特定パターンを置換したり、指定した行を削除したりします。

» 文字列の置換(s コマンド)

基本構文は sed 's/検索文字列/置換文字列/フラグ' です。末尾に g(グローバルフラグ)をつけると1行内のすべての出現箇所を置換します。

# 文字列の置換(標準出力に結果を表示)
sed 's/localhost/127.0.0.1/g' config.txt

# パスなどスラッシュを含む文字列を置換する場合は区切り文字を @ や # に変更可能
sed 's@/usr/local/bin@/opt/bin@g' path.txt

» 行の削除と特定範囲の抽出

# 1行目(ヘッダー行)を削除して出力
sed '1d' data.csv

# 空行をすべて削除
sed '/^$/d' document.txt

# 10行目から20行目までを抽出して表示(-n と p)
sed -n '10,20p' server.log

» ファイルの直接上書き編集(-i オプション)

ファイルを直接書き換える場合は -i を指定します。Linux(GNU sed)と macOS(BSD sed)で仕様が異なるため注意が必要です。

# Linux (GNU)
sed -i 's/DEBUG=true/DEBUG=false/' settings.env

# macOS (BSD): バックアップ拡張子の明示が必要(空文字 '' を指定)
sed -i '' 's/DEBUG=true/DEBUG=false/' settings.env

awk による列抽出と集計

スペースやカンマで区切られた表形式のデータを処理する強力なツールです。

» フィールドの参照と区切り文字

$1, $2 はそれぞれ第1列、第2列を表し、$0 は行全体を表します。$NF は末尾の列を表します。

# 空白区切りの第1列(IPアドレス)と第3列(ステータス)を表示
awk '{print $1, $3}' access.log

# カンマ区切り(CSV)を指定して第2列を出力(-F)
awk -F',' '{print $2}' users.csv

» 条件判定と集計(BEGIN / END ブロック)

# 第3列が 500 以上のエラー行のみを抽出
awk '$3 >= 500 {print "Error at line", NR, ":", $0}' access.log

# 第2列の数値を合計して平均値を計算
awk '{sum += $2} END {print "Total:", sum, "Average:", sum/NR}' metrics.txt

パイプライン連携の実用例

複数のツールを組み合わせて、Web サーバのアクセスログからアクセス数上位の IP アドレスを即座に集計します。

# 1. ログから IP アドレス(第1列)を抽出
# 2. ソートして出現回数を集計(uniq -c)
# 3. 件数の降順に並べ替え(sort -nr)
# 4. 上位5件を表示(head -n 5)
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 5