大部分のawk
の変数はユーザが好きに使うことができる。そういった変数は自
分で代入をしない限り値が変わるようなことはないし、プログラムに対して何か影響
を与えるということもない。
しかし、awk
の一部の変数は特別な組込みの意味を持っている。
その変数の一部はawk
が自動的にその値を評価する。そのような変数を操
作することによって、 awk
プログラムの動作を操作することが可能である。
他の変数はawk
がその値を自動的にセットする。それを参照すること
によってプログラム中でawk
がどのように働いているのかについて情報を得る
ことができる。
この章ではgawk
の組み込み変数について説明する。組み込み変数の多くは、
それが実際に使われている章でも説明されている。
awk
以下のリストは、変更することによりawk
の挙動を変更することのできる
変数のリストである。アスタリスク `*'がついている変数は
gawk
に特有のものである。
CONVFMT
awk
が使用する
(セクション Built-in Functions for String Manipulationを参照)。
この変数は参照されたときに、sprintf
の第一引数であるような効果を持つ。
デフォルトでは"%.6g"
という値になっている。
CONVFMT
は POSIX の標準によって導入された。
FIELDWIDTHS *
gawk
に対して、固定したカラム境界で入力を扱うように指示するカラ
ムのリストで、リストの個々の要素はスペースで区切られている。また、これは
実験的な機能である。 FIELDWIDTHS
に対する代入はフィール
ド分割の為のFS
の使用をオーバーライドする。より詳しくは、
セクション 固定長データの読み込みを参照。
互換モードでgawk
が起動された場合
(セクション コマンドラインオプションを参照),、FIELDWIDTHS
は
特別な意味を持たず、フィールド分割の処理はFS
の値によってのみ
行われる。
FS
FS
は入力フィールドセパレータである
(セクション フィールドの分割方法の指定を参照)。
その値は一文字の文字列、もしくは複数の文字で構成される正規表現
で、入力レコードをフィールドに分割するときの分割部分にマッチする。
FS
に空文字列(""
)をセットすると、
レコード中のキャラクタ一文字をフィールド一つとして分割を行う。
デフォルトの値は" "
で、一つのスペースからなる文字列である。例外と
して、この値は連続しているスペース、タブ、改行を一つのセパレータとして(9)
認識させ、行の先頭や終端にあるスペース、タブの連続を無視させる。
`-F'オプションを使うことにより、コマンドライン上で FS
の値を変更
することが出来る。
awk -F, 'program' input-files
gawk
がフィールド分割をFIELDWIDTHS
を使用して行っているときに
FS
に値を代入すると、gawk
は通常の正規表現によるフィールド分割を
行う状態に戻る。これはただ単純に`FS = FS'としても同じ結果となる。
IGNORECASE *
IGNORECASE
が非0であるとき、
全ての文字列比較は大小文字を無視して行われる。 このため、
`~' や `!~'を使った正規表現のマッチング、
gensub
,
gsub
,index
,match
, split
,sub
といっ
た関数の正規表現マッチング、RS
によるレコードの区切り、FS
を
使ったフィールド分割は全て大小文字を無視して行われる。
IGNORECASE
の値は配列の添え字付けには何の影響も及ぼさない。
セクション 大小文字を区別するマッチングを参照。
gawk
が互換モード
(セクション コマンドラインオプションを参照)
で動作しているときは、
IGNORECASE
は特別な意味を持たず、正規表現は常に大小文字を区別して
マッチングが行われる。
OFMT
awk
が print
文で出力を行うときに、数値を文字列に変
換するときの動作を制御するのに使用される
(セクション Conversion of Strings and Numbersを参照)
。この変数は参照されたときに、sprintf
(セクション Built-in Functions for String Manipulationを参照)
の第一引数であるような効果を持つ。デフォルトでは"%.6g"
という値に
なっている。初期の
awk
ではOFMT
を、数値から文字列に変更するような全ての式で書式を
特定するために使っていたが、その役割は現在ではCONVFMT
が果たしている。
OFS
print
文を使ったときにフィールドとフィールドの間に出力される。
デフォルトは" "
(一つのスペースからなる文字列)である。
ORS
print
文で出力したときに最後に(付加されて)
出力される。デフォルトは改行コード一つからなる文字列である("\n"
とい
う文字列)。
(セクション Output Separatorsを参照.)
RS
awk
に対する入力のレコードセパレータである。デフォルト値は改行キャ
ラクタである。つまり、デフォルトでは入力レコードはテキスト中の一行である
これは空文字列や正規表現であってもよく、空文字列場合は、レコードは空行の
連続によって区切られ、正規表現の場合にはその正規表現にマッチした
入力テキストによって区切られる。
(セクション 入力をレコードへと分割をするやりかたを参照.)。
SUBSEP
SUBSEP
は添字を区切るものであり、そのデフォルトの値は"\034"
であ
る。この値は多次元配列の名前を分割するために使われる。したがって
foo["A","B"]
と記述すると、実際はfoo["A\034B"]
にアクセスする
(セクション Multi-dimensional Arraysを参照)。
以下のリストはawk
によって自動的に値がセットされ、プログラム中で情報を得る
ことのできる変数のリストである。gawk
に特有の変数には
アスタリスク `*'が目印についている。
ARGC
ARGV
awk
プログラムに対するコマンドライン引数は、ARGV
と呼ばれる
配列に格納される。ARGC
にはコマンドライン引数の数が格納される。
セクション Other Command Line Argumentsを参照.
大部分のawk
の変数とは異なり、ARGV
の添え字付けは
0からARGC
- 1である。たとえば、
$ awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' inventory-shipped BBS-list -| awk -| inventory-shipped -| BBS-listこの例では、
ARGV[0]
には"awk"
が、ARGV[1]
には
"inventory-shipped"
が、ARGV[2]
には"BBS-list"
が
入っている。ARGV
の値は3であり、それはARGV
の最大のインデック
スよりも一つ大きい。それは、インデックスを0から数えるからである。
ARGC
とARGV
の名前と、その添え字付けがゼロからARGC
@minus 1
であるということはC言語で使われているコマンドライン引数の取り扱い方法から
きている。awk
がこれらの変数をどのように使うかは
セクション Using ARGC
and ARGV
を参照。
ARGIND *
AEGV
におけるインデックス。
gawk
は新しいファイルをオープンする度に、
AERGIND
に処理するファイル名のあるARGV
の
インデックスをセットする。
awk
がファイルを処理している間は、
`FILENAME == ARGV[ARGIND]'は常に真である。
この変数はファイル処理に便利である。データファイルのリスト中でリスト中のどこ
のファイルであるかを知ることができるし、コマンドライン上で同じ名前で指定され
ている複数のインスタンスを区別することができる。
awk
プログラム中でARGIND
の値を変更することができ、それにより
gawk
は自動的に次のファイルをオープンするときに新しい値をセットする。
この変数はgawk
の拡張である。ほかのawk
や、gawk
が互換モード
(セクション コマンドラインオプションを参照)で動作している場合は特殊変数ではない。
ENVIRON
ENVIRON["HOME"]
の値は
`/home/arnold/'である。この配列の要素を変更しても awk
がリダイレ
クションやsystem
関数で起動する他のプログラムに渡される環境変数その
ものには影響しない (これは将来のgawk
でもこのように動作するだろう)。
一部のオペレーティングシステムでは環境変数を備えていないものがある。
このようなシステムの場合、配列ENVIRON
は空である
(ENVIRON["AWKPATH"]
を除く)。
ERRNO *
getline
のリダイレクト、getline
での読み込み、 close
でシ
ステムエラーが発生したときにERRNO
にはエラーを表わす文字列がセットされ
る。
この変数はgawk
の拡張である。ほかのawk
や、
gawk
が互換モード(セクション コマンドラインオプションを参照)
であるときは特殊変数ではない。
FILENAME
awk
が現在読み込んでいるファイルのファイル名がセットされて
いる。 awk
が標準入力から(言い替えればコマンドラインでファイル名が与
えられていなければ)入力を行っている場合には FILENAME
は "-"
が
セットされる。 FILENAME
は新しくファイルが読み込まれる度に変更される
(セクション 入力ファイルの読み込みを参照).
BEGIN
ルールの中では入力ファイルがまだ処理されていないので、
FILENAME
の値は""
である。(10)(d.c.)
FNR
FNR
には、現在処理しているファイルでの、カレントレコードの番号が
セットされている。FNR
はレコードの入力の度に更新される
(セクション getline
を使った入力を参照)。
入力ファイルが新しくなる度に0に初期化される。
NF
NF
にはカレントレコード中のフィールドの数が格納されている。 NF
はレコードの入力が行われて新しいフィールドが作られたとき、もしくは$0
が変更される度に更新される (セクション フィールドの検査を参照)。
NR
NR
is set each time a new record is read.
この変数にはプログラムが実行開始してからそれまでに入力されたレコードの数が格
納されている(セクション 入力をレコードへと分割をするやりかたを参照)。
NR
は新しいレコードが入力される度に更新される。
RLENGTH
RLENGTH
にはmatch
関数でマッチした部分文字列の長さが格納されてい
る(セクション Built-in Functions for String Manipulationを参照)。
RSTART
はmatch
関数を起動するとセットされ、マッチする部分文字列
があればその部分文字列の長さが、ない場合には-1が格納される。
RSTART
RSTART
はmatch
関数でマッチした部分文字列の最初のキャラクタの
インデックスが入る
(セクション Built-in Functions for String Manipulationを参照)。
RSTART
はmatch
関数を起動するとセットされ、マッチする部分文字列
があればその開始位置が、ない場合には0が格納される。
RT *
RT
はレコードが読み込まれるたびにセットされる。この変数は、
RS
で指定されるテキストにマッチした
レコードセパレータである入力テキストを保持している。
この変数はgawk
の拡張であり、他のawk
処理系や、gawk
が互換モード(セクション コマンドラインオプションを参照)で動作しているときには
特殊変数ではない。
awk
はレコードを読み込む度に、読み込んだレコードの数そのものをこれ
らの変数にセットするのではなく、これらの変数を単純にインクリメントする。
これは、あなたがプログラム中でこれらの変数の値を書き換えることができると
いうことであり、それ以後はレコードを読み込む度にその値をインクリメントし
ていくのである(d.c.)。例を挙げると
$ echo '1 > 2 > 3 > 4' | awk 'NR == 2 { NR = 17 } > { print NR }' -| 1 -| 17 -| 18 -| 19
のようになるのである。
FNR
がawk
言語に追加される以前
(セクション Major Changes between V7 and SVR3.1を参照)には、
多くのawk
プログラムでファイルごとのレコード数を記憶するのに、
FILENAME
が代わる度にNR
を0にリセットする
ということでこの仕様を利用していた。
ARGC
and ARGV
セクション 情報を伝達する組込み変数を参照では、
ARGC
やARGV
に格納されている情報に関する説明を行っている。
$ awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' inventory-shipped BBS-list -| awk -| inventory-shipped -| BBS-list
この例では、ARGV[0]
には"awk"
が、ARGV[1]
には
"inventory-shipped"
が、そしてARGV[2]
には
"BBS-list"
がセットされている。
awk
プログラムはARGV
には含まれていない。
その他の引数を伴った特殊なコマンドラインオプションも含まれていない。
しかし、コマンドライン上での変数代入は引数として扱われる
。これには`-v'オプションによって
代入された変数も含まれる(セクション コマンドラインオプションを参照)。
コマンドライン上にある通常の変数代入は引数として扱われ、
こういったものはARGV
配列に含まれている
$ cat showargs.awk -| BEGIN { -| printf "A=%d, B=%d\n", A, B -| for (i = 0; i < ARGC; i++) -| printf "\tARGV[%d] = %s\n", i, ARGV[i] -| } -| END { printf "A=%d, B=%d\n", A, B } $ awk -v A=1 -f showargs.awk B=2 /dev/null -| A=1, B=0 -| ARGV[0] = awk -| ARGV[1] = B=2 -| ARGV[2] = /dev/null -| A=1, B=2
プログラム中でARGC
やARGV
を変更することができる。
awk
は入力ファイルの終端に達する度に、ARGV
の次の要素を
次の入力ファイルのファイル名として扱う。
そこに異なる文字列を格納することによって、読み込むファイルを変更する
ことができる。このとき、標準入力は"-"
で表わすことができる。
新しい要素を追加し、ARGC
をインクリメントすることによって、
読み込むファイルを増やすことができる。
ARGC
の値をデクリメントすると、リストの最後にある
入力ファイルがリストから削除される。ARGC
の古い値を
他の場所で使うことにより、リストから削除された引数を
ファイル名以外のものとして使うことができるようになる。
リストの中程にあるファイルをリストから削除するには、
空文字列(""
)を対象となるファイルの名前が格納されている
ARGV
の要素に代入してしまえば良い。
特殊な仕様として、awk
は
空文字列に置き換えられたファイル名を無視する。
同様に、ARGV
からある要素を削除するためにdelete
文を使うこともできる(セクション The delete
Statementを参照)。
これらのアクションは、典型的には入力に対して何等かの処理が行われる前、
BEGIN
ルール中で行われる。
セクション 大きなファイルを分割するを参照。
また、ARGV
から要素を削除するやり方は
セクション 出力を複数のファイルに複製するを参照。
以下のコード片はARGV
を順番に確認し、そこからコマンドラインオプションを
削除する処理をしている。
BEGIN { for (i = 1; i < ARGC; i++) { if (ARGV[i] == "-v") verbose = 1 else if (ARGV[i] == "-d") debug = 1 else if (ARGV[i] ~ /^-?/) { e = sprintf("%s: unrecognized option -- %c", ARGV[0], substr(ARGV[i], 1, ,1)) print e > "/dev/stderr" } else break delete ARGV[i] } }
awk
プログラムにオプションを渡すために、awk
に対する
オプションの末尾に`--'を与えて、その後にawk
プログラム
に対するオプションを、以下に示す例のようにして置かなければ
ならない。
awk -f myprog -- -v -d file1 file2 ...
これはgawk
では不要である。`--posix'オプションが指定され
ないかぎり、gawk
は認識できないあらゆるオプションに対して
なんのメッセージも出さずにそのままARGV
へと格納し、
awk
プログラムはそういったオプションを取り扱えるのである。
As soon as it
知らないオプションを発見すると、gawk
は即座にオプション解析を
やめて、その後に認識できるオプションがあってもそれをgawk
に
対するオプションとして解析することはない。
gawk -f myprog -d -v file1 file2 ...
上記の例に対してgawk
は、`-d'が正当なオプションでないので
`-v'をawk
プログラムにそのまま渡すのである。