大部分の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プログラムにそのまま渡すのである。