awk はレコードのストリームとしてテキストを変換します。各レコードを順序付けられた
パターン・アクション規則に対してテストするため、レポート、検証、小規模なデータ変換
に適しています。POSIX awk は広く利用でき、GNU awk(gawk)は、スクリプトが必要
とする場合に宣言すべき機能を追加します。
レコード、フィールド、カウンター #
RS は入力レコードを分離し、デフォルトは改行です。FS はフィールドを分離し、
デフォルトでは空白とタブの連続を特別に扱います。$0 はレコード全体、$1 から
$NF はフィールド、NF はフィールド数です。NR はすべての入力にわたって
レコードを数えますが、FNR は入力ファイルごとに再開します。
awk -F ':' '$3 >= 1000 { print $1, $6 }' /etc/passwd
awk -v limit=10 'NF > limit { print FILENAME ":" FNR }' input構造化された結果を生成する場合は、出力区切り文字を明示的に設定します。
BEGIN { FS = OFS = "," }
NF >= 3 { total += $3 }
END { print "total", total }GNU awk は複数文字の RS を正規表現として扱います。移植可能な awk ではレコード
区切り文字が 1 文字である必要があるため、NUL 区切りの名前を扱うスクリプトでは、
たとえば gawk -v RS='\0' のように gawk を明示的に要求します。
パターン・アクションプログラムを書く #
規則の形式は pattern { action } です。/error/ のような正規表現は $0 をテストし、
式は awk の真偽規則に従ってテストし、パターンを省略するとすべてのレコードに一致
します。BEGIN は入力前に実行され、END は最後のレコードの後に実行されます。
BEGIN { FS = ":" }
$7 ~ /nologin$/ { next }
{ users[$1] = $6 }
END {
for (name in users)
print name, users[name]
}連想配列のキーは文字列であり、for (key in array) の反復順序は移植可能ではありません。
決定的な出力が必要な場合は、外部で出力をソートするか、文書化された GNU awk の
順序付け機能を使用します。
値と正規表現 #
awk の値には文字列形式と数値形式があります。コンテキストによって変換が選択されます。
total += $3 には数値が必要で、連結には文字列が必要です。数値以外の文字列は数値
コンテキストで 0 に変換されるため、変換に依存する前に入力を検証します。
正規表現は POSIX 拡張正規表現構文を使用します。~ と !~ は値をテストし、
match()、sub()、gsub()、split() はアクション内で動作します。sub() は
最初の一致を変更し、gsub() はすべての一致を変更します。
awk '
/^[[:space:]]*#/ || NF == 0 { next }
$2 ~ /^[0-9]+$/ { count[$1] += $2 }
END { for (key in count) print key, count[key] }
' metrics.txtawk を安全に呼び出す
#
Single-quote the program so the shell does not expand $1, backslashes, or
glob characters before awk receives them. Pass shell data with -v rather
than interpolating it into program source:
awk -v prefix="$prefix" '$1 == prefix { print $0 }' input
awk -f report.awk -- --filename-starting-with-dashThe -- オプションに対応する実装では、awk のオプション処理を終了します。入力名が -
で始まる可能性がある場合に使用してください。-v のデータは awk ソースではなく
データとして扱います。信頼できない CSV には CSV 対応パーサーか、GNU awk の文書化
された --csv モードを使用してください。FS="," は CSV の引用規則を実装しない
ためです。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)