awkと向き合う
はじめに
awk
は、テキストファイルの操作やパターンマッチングを行うための強力なツールです。ここでは、awkの基本的な使い方および応用編を忘備録として残しておきます。
基本的な構文
awk 'pattern {action}' file
特定の列を抽出する
ファイル data.txt
から第1列と第3列を表示する
awk '{print $1, $3}' data.txt
awk のデフォルトで解釈される列のセパレータはスペースまたはタブ文字です。これにより、空白やタブで区切られたフィールドを処理することができます。
パターンにマッチする行を抽出する
data.txt
から “apple” を含む行を表示する
awk '/apple/' data.txt
条件に基づいて処理を行う
第2列が50以上の行を表示する
awk '$2 >= 50' data.txt
フィールドセパレータを指定する
カンマ区切りのファイル data.csv
から第2列を表示する
awk -F ',' '{print $2}' data.csv
BEGIN と END ブロックを使う
ファイルの先頭と末尾で処理を行う
awk 'BEGIN {print "Start of file"} {print $0} END {print "End of file"}' data.txt
複数条件を使用する
第2列が50以上かつ第3列が100以下の行を表示する
awk '$2 >= 50 && $3 <= 100' data.txt
【応用編】シェル変数の値を
awk
の変数として使用する
-v
オプションは awk
コマンドで使用され、シェル変数の値を awk
の変数として使用するために使われます。これにより、シェルスクリプト内の変数を
awk
スクリプトに渡すことができます。
以下に、-v
オプションの使用方法を説明します。
シェルスクリプト例
シェルスクリプト内で定義された変数
LEVEL_ERROR
、LEVEL_WARN
、LEVEL_INFO
、LEVEL_DEBUG
、LEVEL_CUSTOM
を awk
スクリプト内で使う例です。
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
スクリプトに渡し、条件に基づいて異なる色で行を出力することができます。
関連記事
- tailコマンドでテキストの末尾を表示 macOS/Linux/Unix
- GhostScript でPDFの圧縮|シェル
- expectで、対話型のコマンドライン操作を自動化する【シェル・macOS】
- Automatorを使って独自ショートカットキーを作る|AppleScript x シェルスクリプト
- nkfコマンドで文字コード変換 macOS/Linux/Unix