大部分の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が格納される。