パターン検索・処理言語
program-file
[
--
] file ...
gawk
[ \*(PX or \*(GN style options ]
[
--
]
program-text
gawk
は \*(GN プロジェクトが実装した プログラミング言語 \*(AK の処理系です。
本処理系は \*(PX 1003.2 コマンド言語とユーティリティ規約に定められた
言語の定義に適合しています。
本バージョンはまた、Aho, Kernighan, Weinberger の著書
The AWK Programming Language
の記述にもとづいており、
System V Release 4 \*(UX の
awk
の付加機能も含んでいます。
gawk
はまた、Bell Labs の新機能および \*(GN 独自の拡張も提供します。
コマンドラインは、
gawk
へのオプション、(もし
-f
または
--file
オプションにより指定されていなければ)\*(AK のプログラムテキスト、そして
残りの引数列からなります。
この残りの引数列は、定義済み \*(AK 変数
ARGC ,
ARGV
を用いることで参照できます。
gawk
へのオプションは、伝統的な \*(PX 形式の 1 文字オプションと、\*(GN 形式の
ロングオプションがあります。
\*(PX 形式のオプションは単一の \*(lq-\*(rq で始まり、一方 \*(GN 形式のもの
は \*(lq--\*(rq で始まります。ロングオプションは \*(GN の独自仕様と
\*(PX の必須仕様の両方について用意されています。
\*(PX 標準に従い、
gawk
独自仕様のオプションは
-W
オプションへの引数で与えます。
複数の
-W
オプションを指定することもできます。
後述の
ように、各
-W
オプションには、それに対応するロングオプション
が存在します。ロングオプションへの引数は、空白を入れずに
=
でつないで指定するか、その次のコマンドライン引数として渡すことができます。
ロングオプションは、短縮形が一意である限り、短縮することができます。
gawk
は以下のオプションを受け付けます。
fs
とします。
var
に値
val
を設定します。このようにして設定
した変数は、 \*(AK プログラムの
BEGIN
ブロック内でも参照できます。
program-file
から読み込みます。
-f
(または
--file
) オプションは複数回使
用することができます。
NNN
に設定します。フラグ
f
は最大フィールド数、フラグ
r
は最大レコードサイズを設定します。この 2 つのフラグと
-m
オプションは、Bell Labs バージョンの \*(UX
awk
に由来しています。しかし、
gawk
にはこのような制限はありませんので、
gawk
では本オプションは無視されます。
互換
モードで動作します。互換モードでは、
gawk
は \*(UX
awk
と等価な動作を行い、\*(GN 独自拡張は解釈できません。
このオプションの他の形式よりも、
--traditional
を使用することが好まれます。
詳しくは後述の
GNU 拡張
を参照してください。
GNU コーディング規約
に従い、本オプションを指定すると
awk
はただちに終了し、成功を意味する終了ステータスを返します。)
awk
へ移植できない構造に関して警告を行います。
awk
を使ってきたユーザのために郷愁の瞬間を提供します。
互換
モードをオンにし、更に以下の制約が課せられます。
bububububuインターバル表現 (interval expressions)
を有効にします
(後述の
正規表現
を参照してください)。
インターバル表現は伝統的な \*(AK 言語では利用できませんでした。
awk
と
egrep
が一貫性を持つように、\*(PX 標準がこれらを追加しました。
しかし、これらを使用すると古い \*(AK プログラムを動かなくしてしまうでしょうから、
このオプションによって要求されたときと、
--posix
が指定されたときに、
gawk
はこれらの機能を提供します。
program-text
を \*(AK プログラムとして用います。本オプションにより、ライブラリ化された関数 (
-f
または
--file
オプションを用いて読み込む) とコマンドラインから入力されたプログラムを
簡単に合成することができます。
これは、主にシェルスクリプトで用いられる中規模から大規模な \*(AK プログラム
のために用意されました。
gawk
プログラムのバージョン情報を標準出力へ書き出します。これは主に、
あなたが使用している
gawk
プログラムが Free Software Foundation が配布してい
るプログラムのうち、最新のものであるかどうかを知る場合に便利です。
またバグレポートのときにも有用です。
(本オプションを指定すると、
GNU コーディング規約
に従い、
awk
はただちに終了し、成功を意味する終了ステータスを返します。)
--gawk
はまず、
program-file
(複数可) が指定されていればそれから、
--source
の引数から、あるいは、最初のオプションではない引数から
プログラムを読み込みます。
-f
と
--source
オプションは、コマンドラインで複数回指定できます。
gawk
は、すべての
program-file
とコマンドラインで指定したプログラムを結
合して使用します。新しく作った \*(AK プログラムひとつひとつに
\*(AK 関数のライブラリを埋め込む必要が無いので、この機能はライブラリの構築に
便利です。
また、ライブラリ関数とコマンドラインで指定したプログラムとを混合して使
うことも可能にしています。
環境変数
AWKPATH
により、
-f
オプションで指定されたファイルを検索するパスを指定できます。
AWKPATH
が設定されていない場合のデフォルトパスは
.:/usr/local/share/awk です。
(実際のディレクトリは
gawk
がどのように構築/インストールされたかに依存して、さまざまなものとなります。)
-f
オプションで指定したファイル名が \*(lq/\*(rq を含んでいる場合は、
パス検索は行われません。
gawk
は、 \*(AK プログラムを次の順序で実行します。
まず、
-v
オプションで指定された変数への代入をすべて行います。
次に、プログラムを内部形式にコンパイルします。
そして、(もし存在すれば)
BEGIN
ブロック (複数存在可) を実行します。
配列
ARGV
で指定されたファイルを順に読み、処理を行います (コマンドラインでファイル名が
指定されていなければ、標準入力に対して処理を行います)。
コマンドラインで指定されたファイル名が
var = val
という形式ならば、それ
は変数への代入であると解釈されます。変数
var
は値
val
に設定されます
(これは、すべての
BEGIN
ブロックを実行したあとに行われます)。コマンドライン
での変数の代入は、\*(AK が入力をフィールドやレコードに分割するためのセパレータ
を実行時に変更するのに便利です。また、1 つのデータファイルに
対し数回処理を行う必要がある場合、状態をコントロールするのにも便利です。
配列
ARGV
の要素に空 () がある場合、
gawk
はその要素を無視します。
gawk
は、入力された各レコードに対してマッチする
パターン
が \*(AK プログラム内にあるかどうかを
検索します。そのレコードにマッチしたパターンすべてについて、それぞれ対応する
アクション
が実行されます。
パターンは、プログラムテキストに出現した順序で検索されます。
入力が尽きると、
gawk
は (もしあれば)
END
ブロック (複数存在可) を実行します。
gawk
はそのレコードを
フィールド
に分割しま
す。分割する際には、変数
FS
の値がフィールドセパレータとして参照されます。
FS
の値が1文字なら、その
文字を境にフィールドが分割されます。
FS
が空文字列の場合、個々の文字がフィールドセパレータとなります。
いずれでもない場合、
FS
は完全な正規表現である
と解釈されます。特殊な場合として
FS
が単一の空白のときには、フィールドは
連続した空白・タブ・改行により分割されます。
(後述の
--posix
の議論を参照してください)。
変数
IGNORECASE
(下記参照) の
値は、
FS
が正規表現の場合フィールド分割にも影響を与えることと、
RS
が正規表現の場合レコード分割にも影響を与えることに注意してください。
変数
FIELDWIDTHS
の値が空白で区切られた数字の列である場合、各フィールドは
固定長であると解釈され、
gawk
は指定された幅ごとにフィールドの
分割を行います。この場合、
FS
の値は無視されます。
FS
に新たに値を設定
することにより、この
FIELDWIDTHS
の効果を打ち消し、標準の動作に戻すことができます。
入力レコード中の各フィールドの値は、左から
$1 ,
$2
等という名前で参照できます。
$0
は
レコード全体です。フィールドに値を代入することもできます。フィールドは定数だ
けでなく、変数によって参照することもできます。以下の例では、入力レコードの 5
番目のフィールドの値を出力します。
B
n = 5
print $n
R
変数 NF は、自動的に入力レコードのフィールドの数に設定されます。
存在しないフィールド (すなわち、
$NF
より右のフィールド) を参照した結果は
空文字列になります。しかしながら、存在しないフィールドへの代入(たとえ
ば、
$(NF+2) = 5
) は
NF
の値を増加させ、間のフィールドには空文字が設定されます。
さらに
$0
の値は、フィールドの値を変数
OFS
の値でフィールドを区切ったものとして再計算されます。
負のフィールド番号への参照は致命的エラーとなります。
NF
を減少させると、新しい値を越えるフィールドの値は失われます。
$0
の値は、フィールドの値を変数
OFS
の値でフィールドを区切ったものとして再計算されます。
gawk
の組み込み変数は以下のとおりです。
ARGCgawk
へのオプションと、プログラム指定は含みま
せん)。
ARGINDARGVCONVFMTENVIRONgawk
からリダイレクトや
system()
関数により実行される
プログラムの環境には影響を与えません(これは、将来の
gawk
では変更される可能性があります)。
ERRNOFIELDWIDTHSgawk
は
FS
の値を用いてフィールド分割するかわりに、固定長のフィールド分割を行
います。固定長のフィールド分割機能はまだ実験的なもので、
gawk
が改良されるに従って意味が変化する可能性があります。
FILENAMEFNRFSIGNORECASEgawk
では
IGNORECASE
は正規表現操作のみに影響しました。現在は文字列比較にも影響します。
NFNROFMTOFSORSRSRTgawk
は、
RS
で指定される文字または正規表現にマッチする入力テキストを、
RT
に設定します。
RSTARTRLENGTHSUBSEPif (val in array) print array[val]もし、配列が多次元インデックスを持つなら、 (i, j) in array を用います。 in はまた、 for ループ中で、配列のすべてのインデックス値について繰り返すために 用いることができます。 配列の要素は、 delete ステートメントを用いて削除することができます。 delete ステートメントはまた、 添字を指定せずに配列名のみを指定することにより、 配列全体を削除するためにも使えます。
CONVFMT = %2.2f a = 12 b = aR 変数 b は文字列値 12 となり、12.00 とはなりません。
gawk
は、以下のようにして比較を行います:
2 つの変数が数値なら数値として比
較します。もし片方が数値で片方が`数値'文字列なら、数値として比較されます。
片方が数値でない文字列なら、数値のほうが文字列に変換され、文字列として
比較されます。両方とも文字列なら、文字列として比較されます。\*(PX 標準に従う
なら、両方とも数値文字列の場合は数値として比較しますが、これは明ら
かに間違いです。
gawk
はそのような動作をしません。
57 のような文字列定数は数値文字列では
なく
、文字列定数です。「数値文字列」の概念は、フィールド、
getline
の入力、
FILENAME
、
ARGV
の要素、
ENVIRON
の要素、数値文字列から
split()
によって作成された配列の要素に対してのみ適用されます。
基本的な考え方では、
ユーザ入力
、それも数値に見えるユーザ入力のみが数値として扱われます。
初期化されていない変数は、数値としては 0 を、文字列としては (空文字列) を
持ちます。
BEGIN
END
/ regular expression /
relational expression
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
( pattern )
! pattern
pattern1 , pattern2
BEGIN
と
END
は特殊なパターンであり、入力と比較されることはありません。すべての
BEGIN
パターンに対応したアクション部は結合され、
そのようなすべてのアクション部が単一の
BEGIN
ブロック中にあるかのように扱われます。
結合されたアクションは、
すべての入力ファイルの読み込みに先立って実行されます。同様にすべての
END
ブロックは結合され、すべての入力ファイルの処理後 (あるいは、exit ステートメント
が実行されたとき) に実行されます。
BEGIN
と
END
はパターン式内で他のパターンと混ぜて使うことはできません。また、
BEGIN
と
END
パターンはアクション部を省略することができません。
/ regular expression /
パターンでは、正規表現 (regular expression)
にマッチした入力レコードに対してアクション
が実行されます。正規表現は
egrep (1)
と同じものが使えます。あとに要約を示します。
関係式(relational expression)
では、後述のアクションについての節で示す演算子を用いることが
できます。
これらは概して、特定のフィールドが正規表現にマッチするかどうかを
調べるために用いられます。
演算子
&& ,
|| ,
!
は、それぞれ C 言語での論理AND、論理OR、論理NOT と等価です。
C 言語と同様に、評価値が確定した時点で以降の評価を打ち切ります。
これらは複数のパターン式を結合するために使用されます。
他のプログラミング言語と同様、括弧によって評価順序を変更することができます。
?:
演算子は C 言語のものと同様です。もし、最初のパターンが真なら、
テストのために 2 番目のパターンが用いられ、そうでなければ 3 番目のパターンが
用いられます。2 番目と 3 番目のパターンのどちらかだけが評価されます。
pattern1 , pattern2
形式は
範囲パターン
と呼ばれます。範囲パターンは、
pattern1
にマッチするレコードから、
pattern2
にマッチするレコードまでのすべてにマッチします。
この形式は、他のパターン式と混合して用いることはできません。
egrep
のものと同様に、拡張された正規表現です。
以下の構成要素から成り立っています。
cc
にマッチします。
\cc
にマッチします。
含む
任意の 1 文字にマッチします。
^$[ abc... ]abc...
のいずれか 1 文字にマッチします。
[^ abc... ]abc...
以外の 1 文字にマッチします。
r1 | r2r1
または
r2
にマッチします。
r1r2r1
の直後に
r2
が続くものにマッチします。
r +r
の 1 回以上の繰り返しにマッチします。
r *r
の 0 回以上の繰り返しにマッチします。
r ?r
の 0 回または 1 回の繰り返しにマッチします。
( r )r
にマッチします。
インターバル表現
を表します。ブレース中に数値が 1 つある場合、直前の正規表現
r
が
n
回繰り返されます。2 つの数値がコンマで区切られている場合、
r
は
n
回から
m
回繰り返されます。1 つの数値に続いてコンマがある場合、
r
は少なくとも
n
回繰り返されます。
インターバル表現は
--posix
または
--re-interval
がコマンドラインにて指定されているときのみ利用可能です。
\y\B\<\>\w\W\`\'文字クラス
は \*(PX 標準で導入された新機能です。
文字クラスは特定の属性を持つ文字列リストの特殊表現ですが、
実際の文字集合自身は国や文字集合によって様々なものとなります。
例えば、アルファベット文字はアメリカ合州国とフランスとでは異なります。
文字クラスが有効なのは、
文字リストのブラケットの中の正規表現だけです。
文字クラスは、
[:
と、クラスを表現するキーワードと、
:]
で構成されます。
以下に \*(PX 表現で定義される文字クラスを示します。
[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]すべて
のアルファベットと数値にマッチします。
文字リスト中には、更に 2 つの特殊シーケンスを使用できます。
これらは、
複数の文字によって表現される単一シンボル (
照合文字
と呼ばれます) を持ち、
複数の文字が
参照
やソートにおいては等価であるとされる、非 ASCII 文字集合に適用されます。
(例えば、フランス語では単なる \*(lqe\*(rq とグレーブアクセント付きの e\` とでは
等価です。)
照合シンボル等価クラスgawk
が正規表現のマッチングに使用するライブラリ関数は、
現在 \*(PX 文字クラスのみを理解し、
参照シンボルと等価クラスは理解しません。
\y ,
\B ,
\< ,
\> ,
\w ,
\W ,
\` ,
\'
の演算子は
gawk
固有であり、\*(GN 正規表現ライブラリの機能を元にした拡張です。
様々なコマンドラインオプションによって、正規表現中の文字を
gawk
がどのように解釈するのかを制御できます。
オプション無しgawk
は上述の \*(PX 正規表現および \*(GN 正規表現のすべての機能を提供します。
しかしながら、インターバル表現はサポートされません。
--posix--traditionalawk
の正規表現がサポートされます。\*(GN 演算子、インターバル表現、
\*(PX 文字クラス (
[[:alnum:]]
など) はサポートされません。
8 進または 16 進のエスケープシーケンスで表現される文字は、
正規表現のメタ文字を表現するとしても、
リテラルとして扱われます。
--re-interval( ... )$++ --^+ - !* / %+ -space~ !~in&&||?:expr1
が真なら式の値は
expr2
になり、そうでなければ
expr3
になります。
expr2
か
expr3
のうち片方のみが評価されます。
*= /= %= ^=
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
close( file )getlinegetline < filefile
から次のレコードを
$0
に読み込みます。
NF
が設定されます。
getline varvar
に読み込みます。
NR ,
FNR
が設定されます。
getline var < filefile
から次のレコードを変数
var
に読み込みます。
nextnextfileprintprint expr-listprint expr-list > filefile
に出力します。各式は
OFS
の値で区切られます。出力されるレコードの
最後には
ORS
の値が付加されます。
printf fmt, expr-listprintf fmt, expr-list > filefile
への書式付き出力です。
system( cmd-line )cmd-line
を実行し、終了ステータスを返します (\*(PX に対応しない
システムでは使用できない場合があります)。
fflush([file])file
に関連づけられているバッファをフラッシュします。
file
を指定しないと、標準出力がフラッシュされます。
file
が空文字列の場合、オープンされているすべてのファイルとパイプのバッファを
フラッシュします。
その他の形式のリダイレクトとして以下のものが利用可能です。
print
と
printf
に対して、
>> file
を指定すると出力はファイル
file
に追加され、
| command
は出力をパイプに対して行います。同様に、
command | getline
はコマンドの出力から
getline
を行ないます。
getline
はファイル終端では 0 を、エラー時には -1 を返します。
注: ループ中で
getline
へパイプ書き込みする場合または
print
か
printf
からパイプ読み取りする場合、
コマンドの新インスタンスを作成するために
close()
を使用することが必要です。
パイプが EOF を返すときでも、AWK は自動的にはパイプを閉じません。
%c%d%i%f%o%u%s%%-空白+#0widthwidth
になるようにパディングされます。フィールドは通常空白でパディングされます。
0
フラグが使用された場合には 0 でパディングされます。
width
と精度
prec
の指定機能が使用できます。
幅
または
精度
の指定部分に
*
を指定することで、その値を
printf
または
sprintf()
への引数で指定できます。
gawk
は内部的な特殊なファイル名を解釈します。
これらのファイル名により、親プロセス (通常はシェルです) から受け継いだ
オープン状態のファイルディスクリプタを用いて入出力を行ったり、実行中の
gawk
プロセスに関する情報を得ることができます。
特殊ファイル名は以下のとおりです。
/dev/pid/dev/ppid/dev/pgrpid/dev/user/dev/stdin/dev/stdout/dev/stderr/dev/fd/ nn
に対応しているファイル。
エラーメッセージを出力するには、以下の方法が便利です。
B
print You blew it! > /dev/stderr
R
もしこの機能が無かったら、次のようにするしかないところです。
B
print You blew it! | cat 1>&2
R
これらのファイル名は、コマンドラインのデータファイル指定で使うこともできます。
atan2( y , x )y/x
の逆正接をラジアンで与えます。
cos( expr )expr
の余弦をラジアンで与えます。
exp( expr )int( expr )log( expr )rand()sin( expr )expr
の正弦をラジアンで与えます。
sqrt( expr )srand([expr])expr
の値を乱数生成関数の種として用います。式が指定されなかった場合は、
時刻が用いられます。直前の種の値を返します。
gawk
は以下の定義済み文字列関数を持っています。
gensub(r, s, h [, t])t
から正規表現
r
のマッチを探します。
h
が
g
または
G
で開始する文字列の場合、マッチする
r
をすべて
s
に置き換えます。
そうでない場合、
h
は何番目の
r
のマッチを置き換えるのかを示します。
t
が与えられない場合、代りに
$0
が使用されます。
置換テキスト
s
では、シーケンス
n
ただし
n
は 1 から 9 までの数字を使用して、
n
番目にマッチした括弧付きサブ式を示すことができます。
シーケンス
\0
は文字
&
と同様、マッチしたテキスト全体を表します。
sub()
や
gsub()
とは異なり、修正された文字列が関数の結果として返され、
元の対象テキストは変更され
ません
。
gsub(r, s [, t])t
中で正規表現
r
にマッチした部分をすべて
s
に置換します。置換の個数を返します。
t
を指定しなかった場合は
$0
が用いられます。
置換テキストでは、
&
は実際にマッチしたテキストで置き換えられます。
を使用するとリテラルの
&
を得ることができます。
sub() ,
gsub() ,
gensub()
における
&
とバックスラッシュに関する完全な議論は
Effective AWK Language Programming
を参照してください。
index( s , t )s
中に含まれる文字列
t
の位置を返します。
t
が含まれていない場合は 0 を返します。
length([s])s
の長さを返します。
s を指定しなかった場合には
$0
の長さを返します。
match( s , r )s
中で正規表現
r
にマッチする位置を返します。マッチしない場合は 0 を
返します。
RSTART
と
RLENGTH
の値が設定されます。
split(s, a [, r])s
を正規表現
r
を用いて分割し、配列
a
に格納します。
フィールド数を返します。
r
が省略され
た場合は
FS
が用いられます。配列
a
の内容は、分割前にクリアされます。
分割は、上述のフィールド分割と同じ動作を行います。
sprintf( fmt , expr-list )fmt
に従って
exp-list
を整形表示し、結果の文字列を返します。
sub(r, s [, t])substr(s, i [, n])s
の
i
文字目から始まる最大
n
文字の部分文字列を返します。
n
が省略された場合、
i
文字目以降の部分文字列が返されます。
tolower( str )str
をコピーし、大文字をすべて小文字に変換したものを返します。
アルファベットでない文字は変化しません。
toupper( str )str
をコピーし、小文字をすべて大文字に変換したものを返します。
アルファベットでない文字は変化しません。
gawk
はタイムスタンプを取り出したり、フォーマット
するための 2 つの関数を提供します。
systime()strftime([format [, timestamp]])format
に従って
timestamp
をフォーマットします。
timestamp
は
systime()
が返す値と同じ形式でなければなりません。
timestamp
が省略された場合、現在の日付が使用されます。
format
が省略された場合、
date (1)
が出力に使用するものと同じデフォルトフォーマットが使用されます。
利用可能なフォーマットについては、\*(AN C の
strftime()
関数の仕様を参照して下さい。パブリックドメインな
strftime (3)
とそのマニュアルページが
gawk
とともに配布されています。もし、
gawk
を作成するためにその
strftime
を用いた場合は、そのマニュアルに記述されている変換書式が
gawk
でも利用可能です。
エスケープシーケンス
が使えます。
\\\a\b\f\n\r\t\v\x hex digits ddd c
function f(p, q, a, b) # a & b は局所変数
{
...
}
R
関数呼び出しにおける左括弧は、空白を狭まずに関数名の直後に
置かなければいけません。
これは、文字列結合演算子との曖昧さを生じさせないために必要です。
この制限は、上述の組み込み関数にはあてはまりません。
関数は、他の関数を呼び出したり、自分自身を再帰的に呼び出すことができます。
局所変数として用いられる関数引数は、関数起動時に空文字列および 0
に初期化されます。
関数から値を返すには
return expr
を使用してください。
値を指定しない場合、または関数の終りから \*(lq落ちる\*(rq
(訳注: 関数を閉じるブレースに到達する) ことにより関数から戻る場合、
値は未定義です。
--lint
が指定されたとき、
gawk
は実行時ではなくパーズ時に未定義関数の呼び出しに関して警告します。
実行時の未定義関数の呼び出しは致命的なエラーとなります。
function
のかわりに
func
を用いることができます。
\*(lq/etc/passwd\*(rq から全ユーザのログイン名を取り出し、ソートして出力します。
B BEGIN { FS = : } { print $1 | sort }
R ファイルの行数を数える。
B { nlines++ } END { print nlines }
R 行番号をつける。
B { print FNR, $0 }
R 全ファイルを通した行番号をつける。
B { print NR, $0 } R
gawk
は最新版の \*(UX
awk
との互換性だけでなく、\*(PX 標準との互換性も追求しています。
このため
gawk
には以下のような機能が取り入れられています。
これらの機能は \*(AK 本には述べられていませんが、
Bell Labs および \*(PX 標準の
awk
が有している機能です。
プログラム実行前に変数代入を行なう
-v
オプションは新しい物です。
\*(AK 本によれば、コマンドラインで指定された変数代入は
awk
が引数をファイル名としてオープンする際に行なわれることになります。つまり
これは
BEGIN
ブロックの実行後です。しかしながら初期の頃の実装では、引数の中でファイル名に
先立って変数代入が指定されている場合には、代入は
BEGIN
ブロック実行の
前に
行われていました。そしてアプリケーションは、この「仕様」に依存する
ようになりました。
awk
がそのドキュメントに合うように直された時、昔の動作に依存している
アプリケーションの便宜を図るためにこのオプションが加えられました。
(この仕様は AT&T および \*(GN の開発者達によって合意されました。)
独自機能のための
-W
オプションは \*(PX 標準に従ったものです。
引数の列に特別なオプション \*(lq--\*(rq を指定すると、
gawk
はそこがオプションの終わりであると解釈します。
互換モードにおいては未定義オプションは警告が出力され、それ以外のものは
無視されます。
通常の実行においては残りの引数は \*(AK プログラムに引き渡されます。
\*(AK 本は
srand()
の返り値を定義していません。
\*(PX 標準
では、その関数が使っている種を返し、
乱数シーケンスを追跡できるようにしています。
したがって
gawk
における
srand()
も現在の種を返すようにしてあります。
その他にも以下のような新機能があります。
-f
オプションの複数回使用 (MKS
awk に倣いました);
ENVIRON
配列;
エスケープシーケンス
\a
と
\v
(
gawk
で最初に実装され、AT&T の
awk
にフィードバックされました);
組み込み関数
tolower()
と
toupper()
(AT&T に倣いました);
printf
における \*(AN C 変換指定
(AT&T 版で最初に実装されました)。
gawk
は \*(PX
awk
に対して多くの拡張が行なわれています。
この節ではそれらについて解説します。
--traditional
オプション付きで
gawk
を起動することによって、
ここで述べられている拡張機能をすべて禁止することができます。
gawk
が持つ以下の機能は
\*(PX
awk
では使用できません。
bubububububububububububugawk
の
close()
は、ファイルやパイプをクローズする際に呼び出す
fclose (3)
や
pclose (3)、
からの返り値を返します。
オプション
--traditional
付きで
gawk
を起動し
-F
オプションへの引数
fs
として \*(lqt\*(rq を与えた場合に、
FS
の値はタブ文字に設定されます。
gawk -F\t ...
とタイプしても、シェルが単に \*(lqt\*(rq をクォートするので、\*(lq\t\*(rq は
-F
オプションに渡されません。
これは少々見苦しい特殊事例ですので、デフォルトの動作としては
採用されていません。
--posix
を指定した場合にも、この動作は行なわれません。
タブ文字をフィールドセパレータとして使用したい場合には、
クォートを使用するのが最良です:
gawk -F'\t' ... .
If
awk
was compiled for debugging, it will
accept the following additional options:
gawk
maintainers, and may not even be compiled into
gawk .
gawk
は歴代の \*(AK の実装にあった 2 つの機能を備えています。
1 つめとして、組み込み関数
length()
は引数無しで呼び出せるだけでなく、さらに括弧無しでも呼び出せます!
したがって
B
a = length # Holy Algol 60, Batman!
R
は以下の2例と同じです。
B
a = length()
a = length($0)
R
\*(PX 標準ではこの機能は \*(lqdeprecated\*(rq と注意書きされており、
gawk
ではコマンドラインで
--lint
を指定した場合に、この機能の使用に対して警告を出力します。
もう 1 つは、
while ,
for ,
do
ループ本体の外でも
continue ,
break
ステートメントを使用できるという機能です。
伝統的な \*(AK の実装では、このように使用した
continue
ステートメントを
next
ステートメントと等価なものとして扱ってきました。
gawk
では
--traditional
が指定された場合に、この機能を使うことができます。
gawk
はコマンドラインで
--posix
が指定されている時と全く同じ動作をします。
このとき
--lint
が指定されていると
gawk
はこの作用についての警告メッセージを出力します。
AWKPATH
環境変数を使用して、
gawk
が
-f
および
--file
オプションで指定されたファイル名を検索するディレクトリを指定できます。
awk
との互換性のためだけに残されています。
ファイル
/dev/fd
および
/dev/stdin ,
/dev/stdout ,
/dev/stderr
を実際にサポートしているシステムでの
gawk
からは、それらがないシステムとは違った出力が得られるかもしれません。
gawk
はそれらのファイルを内部で解釈する際に標準出力への出力を
/dev/stdout
への出力と同期させますが、それらのファイルを持つシステムでは
出力はそれぞれ異なるファイルへ向けられます。
利用者の方で気を付けるようにしてください (Caveat Emptor)。
文法的に誤った単一文字プログラムはパーズスタックを溢れさせる傾向があり、
まったく分からないメッセージを生成する傾向にあります。
このようなプログラムの診断は驚くべきことに一般に難しく、
診断の努力はまったく無意味になります。
awk
の最初のバージョンは、AT&T Bell Labs の Alfred Aho と
Peter Weinberger および Brian Kernighan によって設計、実装されました。
Brian Kernighan はその保守と改良を続けています。
Free Software Foundation の Paul Rubin と Jay Fenlason
が、Seventh Edition \*(UX で配布された最初のバージョンの
awk
と互換性を持つように
gawk
を書きました。
John Woods は数々のバグ修正を送って下さいました。
David Trueman は、Arnold Robbins が送って下さった内容をもとに、
gawk
を新バージョンの \*(UX
awk
互換にしました。
DOS への最初の移植は Conrad Kwok と Scott Garfinkle によって
行なわれました。
現在は Scott Deifik が DOS 版の保守をしています。
Pat Rankin は VMS への移植を行ない、Michal Jaegermann は Atari ST への
移植を行ないました。
OS/2 への移植は Kai Uwe Rommel が Darrel Hankerson の助けを借りて
行ないました。
Fred Fish が Amiga サポートの提供を行いました。
gawk
のバグを見付けたら、電子メールを
bug-gawk@gnu.org
宛に送ってください。
電子メールには、オペレーティングシステムとそのリビジョン、
gawk
のリビジョン、コンパイルに使用した C コンパイラ、
問題を再現するできるだけ小さなテストプログラムとデータを記述してください。
バグレポートを送る前に 2 つのことを行ってください。
第 1 に、最新の
gawk
を使用されていることを確認してください。
多くの (通常微妙な) バグが各々のリリースで修正されていますので、
ご使用のものが古い場合には問題は既に解決されているかもしれません。
第 2 に、このマニュアルページとリファレンスマニュアルを注意深く読み、
あなたがバグだと思うものが確かにバグであり、
大きく変わった言語仕様ではないことを確認してください。
バグレポートを
comp.lang.awk
に投稿することだけはしないでください。
gawk
の開発者達は時々このニュースグループを読みますが、
バグレポートをこのニュースグループに投稿しても
バグレポートとして信頼性がありません。
上記のアドレスへの電子メールでお願いします。