awkとsedを使いこなす:Sysadminのためのログと設定ファイル処理の極意

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Linuxでのテキスト処理:手作業を卒業する時

5GBのログファイルをvimで開き、たった1行のエラーを探していませんか?あるいは50個の設定ファイルのIPアドレスを1つずつ手作業で修正していますか?もしそうなら、貴重な時間を無駄にしています。駆け出しの頃,私は設定ファイルの修正に午後の時間を丸々費やしたことがありました。一方で、ベテランエンジニアはたった1行のsedコマンドを使い、わずか3秒で終わらせていました。

Linuxの世界において、sedawkは切り離せない最強のコンビです。sed (Stream Editor) はテキストの検索と置換に特化しています。対してawkは、列ごとのデータ抽出やレポート作成に非常に強力です。この2つをマスターすれば、サーバー上のデータを完全にコントロールできるようになります。

今すぐ試す:5分で実感できる効果

退屈な理論は後回しにしましょう。違いを実感するために、最も一般的な2つのタスクを試してみてください。

1. sedによるファイル内容の一括変更

config.txt内のlocalhost127.0.0.1に変更する必要があるとします。

sed 's/localhost/127.0.0.1/g' config.txt

このコマンドは結果を画面に表示するだけなので、確認に最適です。ファイルに直接上書きするには、-iフラグを追加します:

sed -i 's/localhost/127.0.0.1/g' config.txt

2. awkによる列データの抽出

/etc/passwdファイルからユーザー名のリストを取得します(各フィールドは:で区切られています):

awk -F: '{print $1}' /etc/passwd

非常にシンプルですね。それでは、それぞれのツールの具体的な活用方法を深掘りしていきましょう。

sedを使って仮想マシンを開かずにファイルを編集する

sedは1行ずつ読み込み、ルールを適用して結果を出力する仕組みで動作します。基本構文はs/検索文字列/置換文字列/フラグです。

sedの実戦テクニック

  • ログファイルのクリーンアップ: 空行を即座に削除して見やすくします。
    sed -i '/^$/d' system.log
  • 設定ファイルの修正: 設定ミスがある場合、10行目から20行目までを削除します。
    sed '10,20d' server.conf
  • 新しい設定の追加: ServerNameを含む行の直後にServerAliasを挿入します。
    sed '/ServerName/a \    ServerAlias www.myapp.com' vhost.conf

重要な注意点: 確信がない限り、sed -iを多用しないでください。正規表現の小さなタイポ(打ち間違い)が、Nginxの設定ファイル全体を壊してしまう可能性があります。まずは-iなしでテスト実行するか、sed -i.bakを使用して自動的にバックアップファイルを作成するのが安全です。

awkを使ってプロのようにデータを分析する

sedが「文字の修正屋」なら、awkは「分析官」です。各行をレコードとして、各単語をデータフィールド(列)として扱います。

awkで覚えておくべき変数

  • $1, $2...: 1列目、2列目…
  • $NF: 最後の列(ファイルの列数が不明な場合に非常に便利です)。
  • NR: 現在の行番号。

応用例:リソース監視

RAMを10%以上消費しているプロセスを見つける:

ps aux | awk '$4 > 10.0 {print $1, $11, $4}'

このコマンドはプロセスリストをフィルタリングし、許容範囲を超えて動作しているプロセスのユーザー、プロセス名、%RAMのみを表示します。

ディレクトリ内のログの合計容量を計算する:

ls -l | awk '{sum+=$5} END {print "合計:", sum/1024/1024, "MB"}'

awkは数学的計算やループをサポートしています。実質的には、ターミナル上で動作する小さなプログラミング言語です。

最強の組み合わせ:awkとsedの連携

パイプ(|)を使ってこれらを組み合わせたときに、真の力が発揮されます。実戦シナリオ:Nginxのログファイルからサーバーへのアクセス数が多い上位10個의 IPアドレスを見つけ、フォーマットを整えます。

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

このIPリストが得られれば、sedを使ってiptablesのブロックコマンドに組み込むことができます。すべてが完全に自動化されます。

コマンドをよりスマートにするためのヒント

1. sedの区切り文字を変更する

パス(path)を修正する場合、スラッシュ/をエスケープ(\/)する必要があり、読みにくくなりがちです。代わりに|:を使うとスッキリします:

# 読みにくい: sed 's/\/var\/www\/html/\/data\/www/g'
# 読みやすい: sed 's|/var/www/html|/data/www|g'

2. 最後の列を素早く取得する

列を数える必要はありません。$NFは常にその行の最後の値を返します。これは、行の長さが一定ではないログファイルを処理する際に非常に役立ちます。

結び

awksedを習得したからといって、一晩で魔法のようにスキルが上がるわけではありません。しかし、作業をより楽に、そして正確に進める助けになります。手作業で苦労する代わりに、数分かけて1行のコマンドを書いてみましょう。慣れてくれば、ターミナルがいかに強力なツールであるかを実感できるはずです。皆さんのシステム運用に役立てていただければ幸いです!

Share: