実践編:テキスト処理ツール(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