awkと向き合う macOS/Linux/Unix/Raspberry Pi

awk は、テキストファイルの操作やパターンマッチングを行うための強力なツールです。ここでは、awkの基本的な使い方および応用編を忘備録として残しておきます。

基本的な構文

bash
awk 'pattern {action}' file

特定の列を抽出する

ファイル data.txt から第1列と第3列を表示する

bash
awk '{print $1, $3}' data.txt

awk のデフォルトで解釈される列のセパレータはスペースまたはタブ文字です。これにより、空白やタブで区切られたフィールドを処理することができます。

パターンにマッチする行を抽出する

data.txt から "apple" を含む行を表示する
bash
awk '/apple/' data.txt

条件に基づいて処理を行う

第2列が50以上の行を表示する

bash
awk '$2 >= 50' data.txt

フィールドセパレータを指定する

カンマ区切りのファイル data.csv から第2列を表示する

bash
awk -F ',' '{print $2}' data.csv

BEGIN と END ブロックを使う

ファイルの先頭と末尾で処理を行う

bash
awk 'BEGIN {print "Start of file"} {print $0} END {print "End of file"}' data.txt

複数条件を使用する

第2列が50以上かつ第3列が100以下の行を表示する

bash
awk '$2 >= 50 && $3 <= 100' data.txt

【応用編】シェル変数の値を awk の変数として使用する

-v オプションは awk コマンドで使用され、シェル変数の値を awk の変数として使用するために使われます。これにより、シェルスクリプト内の変数を awk スクリプトに渡すことができます。

以下に、-v オプションの使用方法を説明します。

シェルスクリプト例

シェルスクリプト内で定義された変数 LEVEL_ERRORLEVEL_WARNLEVEL_INFOLEVEL_DEBUGLEVEL_CUSTOMawk スクリプト内で使う例です。

bash
LEVEL_ERROR="ERROR"
LEVEL_WARN="WARN"
LEVEL_INFO="INFO"
LEVEL_DEBUG="DEBUG"
LEVEL_CUSTOM="CUSTOM"

awk -v error="$LEVEL_ERROR" -v warn="$LEVEL_WARN" -v info="$LEVEL_INFO" -v debug="$LEVEL_DEBUG" -v custom="$LEVEL_CUSTOM" '
{
    if ($0 ~ error) {
        print "\033[31m" $0 "\033[39m" # 赤色
    } else if ($0 ~ warn) {
        print "\033[33m" $0 "\033[39m" # 黄色
    } else if ($0 ~ info) {
        print "\033[32m" $0 "\033[39m" # 緑色
    } else if ($0 ~ debug) {
        print "\033[34m" $0 "\033[39m" # 青色
    } else if ($0 ~ custom) {
        print "\033[35m" $0 "\033[39m" # 紫色
    } else {
        print $0
    }
}
' inputfile

このスクリプトをtailと組み合わせるとログレベルに応じて色付けできて便利です。詳しくはこちら。

シェルスクリプトの説明

  • -v error="$LEVEL_ERROR" の部分は、シェル変数 LEVEL_ERROR の値を awk の変数 error に設定しています。他の変数(warn, info, debug, custom)についても同様です。
  • $0 ~ error の部分は、現在の行($0)が error のパターンにマッチするかどうかを確認しています。
  • 各条件にマッチした場合、対応する色で行を表示します。

このようにして、シェルスクリプト内の変数を awk スクリプトに渡し、条件に基づいて異なる色で行を出力することができます。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事