awk の変数情報を出力する

codeなにがし::phpでサーバ環境の情報を出力するのように Web アプリケーションがメインとなる PHP では簡単に様々な情報を出力することができます。 一方、awk は元々非常にシンプルなプログラムであったため、こうした情報のダンプということが苦手と思われているようですが、gawk のオプションを使うことで簡単に出力することができます。

例えば、以下のようなスクリプトがあったとします。

#! /usr/local/bin/gawk -f
# dump-variables.awk
# 変数をダンプします
# usage: gawk --dump-variables -f dump-variables.awk

BEGIN {
    num      = 123456;                      # 変数
    variable = "strings";                   # 変数 (文字列)

    for (i = 1; i <= 10; i++) {
        array[i] = array[i - 1] " test";    # 配列
    }
}

このコード単独では print 文など表示をする命令が記述されていませんので、何も表示しません。 古い nawk (nawk の "n" は "new" なのですが) や mawk では使えませんが、gawk なら使っている変数を dump-variables オプションを使ってダンプすることができます。

$ gawk --dump-variables -f dump-variables.awk

$ cat awkvars.out
ARGC: number (1)
ARGIND: number (0)
ARGV: array, 1 elements
BINMODE: number (0)
CONVFMT: string ("%.6g")
ERRNO: number (0)
FIELDWIDTHS: string ("")
FILENAME: string ("")
FNR: number (0)
FS: string (" ")
IGNORECASE: number (0)
LINT: number (0)
NF: number (0)
NR: number (0)
OFMT: string ("%.6g")
OFS: string (" ")
ORS: string ("\n")
RLENGTH: number (0)
RS: string ("\n")
RSTART: number (0)
RT: string ("")
SUBSEP: string ("\034")
TEXTDOMAIN: string ("messages")
array: array, 11 elements
i: number (11)
num: number (123456)
variable: string ("strings")

何もしない場合にはカレントディレクトリに awkvars.out というファイル名で出力されますが、標準出力に表示する場合には以下のようにします。

$ gawk --dump-variables=/dev/stdout -f dump-variables.awk
ARGC: number (1)
ARGIND: number (0)
ARGV: array, 1 elements
BINMODE: number (0)
CONVFMT: string ("%.6g")
ERRNO: number (0)
FIELDWIDTHS: string ("")
FILENAME: string ("")
FNR: number (0)
FS: string (" ")
IGNORECASE: number (0)
LINT: number (0)
NF: number (0)
NR: number (0)
OFMT: string ("%.6g")
OFS: string (" ")
ORS: string ("\n")
RLENGTH: number (0)
RS: string ("\n")
RSTART: number (0)
RT: string ("")
SUBSEP: string ("\034")
TEXTDOMAIN: string ("messages")
array: array, 11 elements
i: number (11)
num: number (123456)
variable: string ("strings")

さて、気がつかれた方もいると思いますが、awk が変数を文字列で判定しているか数値で判定しているかも含めて表示されています。

うまく使ってデバッグを楽なものにしたいものです。

tag_gawk.pngtag_gawk.png