【Linux】awkコマンドで商品データやログを高度に抽出・集計する方法

目次

概要

awkは、テキストデータを列(フィールド)単位で認識し、複雑な条件分岐や計算を伴う抽出を可能にするプログラミング言語に近いツールです。CSV形式の在庫リストから特定の数量を超える商品を抽出したり、システムログの特定フィールドを合計したりする場面で、シェルスクリプトの柔軟性を飛躍的に高めます。


仕様(引数・オプション)

構文

awk [オプション] 'awkスクリプト' [ファイル名]

主要なオプション

オプション説明
-F 文字列の区切り文字を指定します(デフォルトは空白またはタブ)。
-f ファイル名スクリプト内容を記述した外部ファイルを読み込んで実行します。
-v 変数=値外部からawk内部へ変数を渡します。

基本の使い方

倉庫の商品マスターファイルから、在庫数が 750 個以上の品目のみを、行番号を付与して抽出する手順です。

BASH

# 「:」区切りで3列目(在庫数)が750以上の行を行番号付きで表示
# ファイルは /home/mori/inventory/product_master.db を使用
awk -F":" '$3 >= 750 { print NR, $0 }' /home/mori/inventory/product_master.db

TEXT

12 ITEM_A01:ELECTRONICS:820:FLOOR_1
45 ITEM_B05:FURNITURE:1200:FLOOR_2
102 ITEM_C10:OFFICE:755:FLOOR_1

実践コマンド

大量の出荷ログから特定の年月日(2026年1月28日)に記録されたユニークな配送先コードの数を算出するパイプライン処理です。

BASH

# 外部スクリプトファイルを適用して高度な抽出を実行
# スクリプト /tmp/analyze_stock.awk に処理を記述済みとする
awk -f /tmp/analyze_stock.awk /home/mori/logs/shipping_2026.log

# 特定の日付を含む行から配送先(1列目)を抽出し、重複を除去してカウント
sudo grep "2026-01-28" /var/log/mori-services/delivery.log | awk '{ print $1 }' | sort | uniq | wc -l

TEXT

[ANALYSIS_REPORT] High demand items detected.
[ANALYSIS_REPORT] Total Records Processed: 5432
128

カスタムポイント

  • 閾値の変更: $3 >= 750 の数値を分析対象の基準値(最小在庫数や警告レベル)に合わせて書き換えてください。
  • デリミタの指定: -F":" の箇所を、カンマなら -F","、タブなら省略または -F'\t' に変更して対象ファイルに適合させてください。
  • 出力列の選択: print $1, $4 のように、必要なフィールド番号のみを指定してレポートの項目を絞り込んでください。

注意点

  1. フィールド番号の誤認: awkは $1 から列のカウントを開始します。 $0 は行全体のデータを指すため、抽出したい列との対応を必ず確認してください。
  2. クォートのエスケープ: アクション部分はシングルクォートで囲むのが基本ですが、内部でダブルクォートを使用する場合、シェルによる解釈を防ぐための配慮が必要です。
  3. 浮動小数点数の扱い: 大規模な数値計算を行う際、非常に大きな整数や精密な小数は環境によって精度が異なる可能性があるため、計算結果の検証を推奨します。

応用

システム上のディスク使用状況から、特定のユーザー「mori」が所有するディレクトリの合計消費容量を計算し、最終結果として出力する例です。

BASH

# 5列目(サイズ)を累積加算し、最後に合計値を表示
du -k /home/mori/data | awk '{ sum += $1 } END { print "Total Data Size for mori: ", sum, "KB" }'

TEXT

Total Data Size for mori:  8421096 KB

まとめ

awkコマンドは、構造化されたテキストデータをプログラムレベルで柔軟に制御できるため、定型的なログ解析やデータ集計作業の自動化において中核を成すツールです。本手順で示したようなフィールド単位の条件抽出やENDブロックによる最終集計を組み合わせることで、手作業では困難な膨大な情報の整理を迅速かつ正確に行うことができます。データの特性に合わせたデリミタの使い分けや、外部スクリプトファイルによる処理の共通化を推進することが、より高度なシステム運用管理を実現するための重要なポイントです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次