awk

最終更新: 2024-05-22 06:31:54 +0800 +0800
tags: Awk | Gnu | Linux
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

awk はレコードのストリームとしてテキストを変換します。各レコードを順序付けられた パターン・アクション規則に対してテストするため、レポート、検証、小規模なデータ変換 に適しています。POSIX awk は広く利用でき、GNU awk(gawk)は、スクリプトが必要 とする場合に宣言すべき機能を追加します。

レコード、フィールド、カウンター #

RS は入力レコードを分離し、デフォルトは改行です。FS はフィールドを分離し、 デフォルトでは空白とタブの連続を特別に扱います。$0 はレコード全体、$1 から $NF はフィールド、NF はフィールド数です。NR はすべての入力にわたって レコードを数えますが、FNR は入力ファイルごとに再開します。

sh
awk -F ':' '$3 >= 1000 { print $1, $6 }' /etc/passwd
awk -v limit=10 'NF > limit { print FILENAME ":" FNR }' input

構造化された結果を生成する場合は、出力区切り文字を明示的に設定します。

awk
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 は最後のレコードの後に実行されます。

awk
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() はすべての一致を変更します。

sh
awk '
  /^[[:space:]]*#/ || NF == 0 { next }
  $2 ~ /^[0-9]+$/ { count[$1] += $2 }
  END { for (key in count) print key, count[key] }
' metrics.txt

awk を安全に呼び出す #

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:

sh
awk -v prefix="$prefix" '$1 == prefix { print $0 }' input
awk -f report.awk -- --filename-starting-with-dash

The -- オプションに対応する実装では、awk のオプション処理を終了します。入力名が - で始まる可能性がある場合に使用してください。-v のデータは awk ソースではなく データとして扱います。信頼できない CSV には CSV 対応パーサーか、GNU awk の文書化 された --csv モードを使用してください。FS="," は CSV の引用規則を実装しない ためです。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)