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_ERROR、LEVEL_WARN、LEVEL_INFO、LEVEL_DEBUG、LEVEL_CUSTOM を awk スクリプト内で使う例です。
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 スクリプトに渡し、条件に基づいて異なる色で行を出力することができます。
関連記事
アイデアノート > macOSで使えるシェル