大部分のawkの変数はユーザが好きに使うことができる。そういった変数は自
分で代入をしない限り値が変わるようなことはないし、プログラムに対して何か影響
を与えるということもない。
組み込み変数の一部はawkが自動的にその値を評価する。そのような変数を操
作することによって、 awkプログラムの動作を操作することが可能である。
他の組み込み変数はawkがその値を自動的にセットする。それを参照すること
によってプログラム中でawkがどのように働いているのかについて情報を得る
ことができる。
この章ではgawkの組み込み変数について説明する。組み込み変数の多くは、
それが実際に使われている章でも説明されている。
awkを制御する組込み変数
以下のリストは、変更することによりawkの挙動を変更することのできる
変数のリストである。
CONVFMT
awkが使用する
(セクション 文字列と数値の変換を参照)。
この変数は参照されたときに、sprintfの第一引数であるような効果を持つ。
デフォルトでは"%.6g"という値になっている。
CONVFMTは POSIX の標準によって導入された。
FIELDWIDTHS
gawkに対して、固定したカラム境界で入力を扱うように指示するカラ
ムのリストで、リストの個々の要素はスペースで区切られている。また、これはまだ
実験的な機能であり、改良中である。 FIELDWIDTHSに対する代入はフィール
ド分割の為のFSの使用をオーバーライドする。より詳しくは、
セクション 固定長データの読み込みを参照.
互換モードでgawkが起動された場合
(セクション awkの起動を参照)、FIELDWIDTHSは
特別な意味を持たず、フィールド分割の処理はFSの値によってのみ
行われる。
FS
FSは入力フィールドセパレータである
(セクション フィールド分割の指定を参照).
その値は一文字の文字列、もしくは複数の文字で構成される正規表現
で、入力レコードをフィールドに分割するときの分割部分にマッチする。
デフォルトの値は" "で、一つのスペースからなる文字列である。例外と
して、この値は連続しているスペース、タブを一つのセパレータとして認識させ、行
の先頭や終端にあるスペース、タブの連続を無視させる。
`-F'オプションを使うことにより、コマンドライン上で FSの値を変更
することが出来る。
awk -F, 'program' input-files
gawkがフィールド分割をFIELDWIDTHSを使用して行っているときに
FSに値を代入すると、gawkは通常の正規表現によるフィールド分割を
行う状態に戻る。
IGNORECASE
IGNORECASEが0以外であるときに、全ての正規表現は大小文字を無視
してマッチングが行われる。 `~' や `!~'を使った正規表現のマッチング。
また、 gsub,index,match, split ,subといっ
た関数は全て大小文字を無視して正規表現のマッチングを行う。
ノート:組み込み変数FSの値によってフィールド分割を行っていると
きは、(フィールド分割のための)正規表現オペレーションは常に大小文字を無視し
た状態で行われている
セクション 大小文字を意識した照合を参照.
gawkが互換モード
(セクション awkの起動を参照)で動作しているときは、
IGNORECASE は特別な意味を持たず、正規表現は常に大小文字を区別して
マッチングが行われる。
OFMT
awkが print文で出力を行うときに、数値を文字列に変
換するときの動作を制御するのに使用される(セクション 文字列と数値の変換を参照) 。この変数は参照されたときに、sprintfの第一引数であるよ
うな効果を持つ。デフォルトでは"%.6g"という値になっている。初期の
awkではOFMTを、数値から文字列に変更するような全ての式で書式を
特定するために使っていたが、その役割は現在ではCONVFMTが果たしている。
OFS
print文を使ったときにフィールドとフィールドの間に出力される。
デフォルトは" "(一つのスペースからなる文字列)である。
ORS
print文で出力したときに最後に(付加されて)
出力される。デフォルトは改行コード一つからなる文字列である("\n"とい
う文字列)。
(セクション 出力セパレータを参照.)
RS
awkに対する入力のレコードセパレータである。デフォルト値は改行キャ
ラクタである。つまり、デフォルトでは入力レコードはテキスト中の一行である
(セクション 入力のレコードへの分割を参照.)
SUBSEP
SUBSEPは添字を区切るものであり、そのデフォルトの値は"\034"であ
る。この値は多次元配列の名前を分割するために使われる。したがって
foo[12,3]と記述すると、実際はfoo["12\0343"] にアクセスする
(セクション 多次元配列を参照).
以下のリストはawkによって自動的にセットされ、プログラム中で情報を得る
ことのできる変数のリストである。
ARGC
ARGV
ARGVという名前の配列に格納されていて awkプ
ログラムから扱うことができる。 ARGCは与えられたコマンドライン引数の数
が格納されている セクション awkの起動を参照. ARGVの要
素は0からARGC - 1まで入っている。たとえば、
awk 'BEGIN {
       for (i = 0; i < ARGC; i++) 
           print ARGV[i] 
     }' inventory-shipped BBS-list
この例ではARGV[0] には "awk"が、ARGV[1]には
"inventory-shipped"が、そしてARGV[2] には"BBS-list"がそ
れぞれ格納されている。このとき、ARGCは3で、ARGVの最後の要素の
添字より1大きいが、これは添字が0から始まっているからである。
ARGC という変数と、0からARGC - 1までの要素を持つ配列変数は
C言語でのコマンドライン引数に対するアクセスの方法から導入された。
awk プログラムそのものはARGVの要素には含まれておらず、他にもコ
マンドラインオプションとその引数も要素に含まれていない。しかし、コマンドライ
ン上での変数の代入は引数として扱われ、配列変数ARGVの中にある。
プログラム中でARGCと、ARGVの要素を変更することができる。
awkは入力ファイルが終端に達する度に、次の入力ファイルとして
ARGVの次の要素を入力ファイルのファイル名として扱う。 (ARGVの要
素に)違った文字列をセットすることにより、プログラムが読み込むファイルを変更
することができる。ここで標準入力を指示するために"-"を使うことができる。
また、(ARGVに)新たに要素を加え、ARGCをインクリメントすることに
よって、読み込むファイルを増やすことができる。
ARGCの値を小さくすると、リストの最後にある入力ファイルがリストから除
去される。プログラム中で元々のARGCの値を記憶しておくことにより、除去
された引数をファイル名以外のものとして扱うことができる。
リストの途中からファイルを除去するには、空文字列("")を ARGVの
除去したいファイルの場所に格納すればよい。特別な機能で、awkは空文字列
に置き換えられたファイル名を無視する。
ARGIND
ARGV配列中のファイルのインデックス。 gawkが新
しいファイルを処理するためにオープンするごとに、 ARGIND に
ARGV中にあるファイル名のインデックスをセットする。したがって、
`FILENAME == ARGV[ARGIND]'は常に真である。
この変数はファイル処理に便利である。データファイルのリスト中でリスト中のどこ
のファイルであるかを知ることができるし、コマンドライン上で同じ名前で指定され
ている複数のインスタンスを区別することができる。
awkプログラム中でARGINDの値を変更することができ、それにより
gawkは自動的に次のファイルをオープンするときに新しい値をセットする。
この変数はgawkの拡張である。ほかのawkでは特殊変数ではない。
ENVIRON
ENVIRON["HOME"]の値は
`/u/close'である。この配列の要素を変更しても awkがリダイレクショ
ンやsystem関数で起動する他のプログラムに渡される環境変数そのものには
影響しない(これは将来のgawkでもこのように動作する)。
一部のオペレーティングシステムでは環境変数を備えていないものがある。
このようなシステムの場合、配列ENVIRONは空である。
ERRNO
getlineのリダイレクト、getlineでの読み込み、 closeでシ
ステムエラーが発生したときにERRNOにはエラーを表わす文字列がセットされ
る
この変数はgawkの拡張である。ほかのawkでは特殊変数ではない。
FILENAME
awkが現在読み込んでいるファイルのファイル名がセットされて
いる。 awkが標準入力から(言い替えればコマンドラインでファイル名が与
えられていなければ)入力を行っている場合には FILENAME は "-"が
セットされる。 FILENAME は新しくファイルが読み込まれる度に変更される
(セクション 入力ファイルの読み込みを参照).
FNR
FNRには、現在処理しているファイルでの、カレントレコードの番号が
セットされている。FNRはレコードの入力の度に更新される
(セクション getlineを使った入力を参照)。
入力ファイルが新しくなる度に0に初期化される。
NF
NFにはカレントレコード中のフィールドの数が格納されている。 NF
はレコードの入力が行われて新しいフィールドが作られたとき、もしくは$0
が変更される度に更新される (セクション フィールドの検査を参照)。
NR
NR は新しいレコードが入力される度に更新される。
RLENGTH
RLENGTHにはmatch関数でマッチした部分文字列の長さが格納されてい
る (セクション 組込みの文字列操作関数を参照).
RSTARTはmatch関数を起動するとセットされ、マッチする部分文字列
があればその部分文字列の長さが、ない場合には-1が格納される。
RSTART
RSTART はmatch  関数でマッチした部分文字列の最初のキャラクタの
インデックスが入る 
(セクション 組込みの文字列操作関数を参照).
RSTARTはmatch関数を起動するとセットされ、マッチする部分文字列
があればその開始位置が、ない場合には0が格納される。