【ツール活用|豆知識】【シェル芸の極意】grep・awk・sedを組み合わせてログ解析を高速化する

1. 導入:なぜパイプラインによる加工が重要なのか

サーバー運用において、数ギガバイトにも及ぶ巨大なログファイルをGUIのエディタで開くのは現実的ではありません。また、複雑なスクリプトをゼロから書くのも時間がかかります。パイプライン(|)を使ってコマンドを連結することで、必要な情報を瞬時に抽出し、障害調査の時間を劇的に短縮できます。これはインフラエンジニアにとって、まさに「魔法」のような必須スキルです。

2. 基礎知識:コマンドの役割分担

テキスト処理の三種の神器である各コマンドの役割を理解しましょう。
grep:指定したパターンに一致する「行」を絞り込む(フィルタリング)。
awk:テキストを列単位で処理する。特定の列だけを表示したり、条件分岐で計算したりできる。
sed:文字列の置換や削除など、ストリームエディタとしての編集を行う。

これらを「|(パイプ)」でつなぐことで、コマンドの出力を次のコマンドの入力へと流し込み、複雑な加工を実現します。

3. 実装:ログ解析のワークフロー

一般的なログ解析の流れは、「不要な行を捨てる(grep)」→「必要な列を抜き出す(awk)」→「見やすく整形・置換する(sed)」という順序です。この流れを覚えるだけで、ほとんどのログ解析は解決します。

4. サンプルプログラム:エラーログを抽出して整形する

以下のコードは、Webサーバーのアクセスログから「404エラー」が発生している行を抽出し、時刻とパスだけを抜き出して、一部の文字列を置換して表示する例です。

access.logから404エラーのみを抽出し、
4列目(時刻)と7列目(パス)を表示し、
最後にスラッシュをコロンに置換して整形するコマンド
cat access.log | grep ” 404 ” | awk ‘{print $4, $7}’ | sed ‘s/\//:/g’

【コードの解説】
1. cat: ファイルの中身を出力
2. grep ” 404 “: ステータスコードが404の行に絞る
3. awk ‘{print $4, $7}’: 空白区切りの4番目と7番目の列を出力
4. sed ‘s/\//:/g’: 文字列中の「/」を「:」にすべて置換

5. 応用・注意点:現場でのテクニック

現場で活用する際のポイントを2点挙げます。

一つ目は「コマンドを段階的に実行する」ことです。最初からすべてを繋げず、まずはgrepだけで期待する行が出ているかを確認し、次にawkで列を確認する、というようにステップを踏むことでバグを防げます。

二つ目は「権限とリソースの配慮」です。巨大なログに対して複雑な処理を行うとCPUやメモリを消費します。頻繁に同じ解析を行う場合は、一度必要な部分だけを別のファイルに書き出して(リダイレクト: >)、そのファイルに対して処理を行うとサーバーへの負荷を抑えられます。

これらのツールを使いこなして、障害対応のスピードを一段階引き上げましょう。

コメント

タイトルとURLをコピーしました