GAWK(1)

名称
gawk - パタンの検索と処理を行う言語

書式
gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

解説
gawk は GNU プロジェクトが実装した プログラミング言語 AWK の処理系です。 本処理系は POSIX 1003.2 コマンド言語とユーティリティ規約に書かれている 言語仕様に準拠しています。 本バージョンはまた、Aho, Kernighan, Weinberger の著書である The AWK Programming Language にもとづいており、System V Release 4 版 UNIX の awk の付加機能も含んでいます。 gawk はまた、GNU 独自の拡張も提供します。

コマンドラインは、 gawk へのオプション、(もし -f または --file オプションにより指定されていなければ)AWK のプログラムテキスト、定義済み AWK 変数の ARGC と ARGV で参照可能になる値からなります。

オプション

gawk へのオプションは、伝統的な POSIX 形式の 1 文字オプションと、GNU 形式の ロングオプションとがあ ります。POSIX 形式のオプションは単一の ``-'' で始まり、GNU 形式のもの は ``--'' で始まります。GNU 形式のロングオプションは GNU の独自仕様と POSIX の必須仕様の両方を提供しています。他の実装による AWK では、伝統的な 1 文字のオプションのみをサポートしている場合が多いようです。

POSIX 標準に従い、 gawk 独自仕様のオプションは -W オプションへの引数で与えま す。複数の -W オプションを指定することもできますし、 複数の引数をコンマで区切って、もしくは引用符で括り空白で区切ることで 一度にまとめて -W オプションに与えることもできます。 -W オプションへの引数では、大文字小文字の区別は行われません。各 -W オプションには、後述のように、等価な GNU 形式のオプション が存在します。GNU 形式のオプションへの引数は、空白を入れずに = でつないで指定するか、その次のコマンドライン引数で渡すことができます。

gawk は以下のオプションを受け付けます。

-F fs
--field-separator=fs
    入力フィールドセパレータ (変数 FS の値) を fs とします。

-v var=val
--assign=var=val
    プログラムを実行する前に、変数 var に値 val を設定します。このようにして設定 した変数は、 AWK プログラムの BEGIN ブロック内で参照できます。

-f program-file
--file=program-file
    gawk への第一引数を用いるかわりに、AWK プログラムをファイル program-file から読み込みます。 -f (または --file ) オプションは複数回使 用することができます。

-mf=NNN
-mr=NNN
    さまざまなメモリの制限値を NNN に設定します。フラグ f は最大フィールド数、フラグ r は最大レコードサイズを設定します。この 2 つのフラグと -m オプションは、AT&T ベル研究所バージョンの UNIX 上の awk に由来しています。しかし、 gawk では本オプションは無視されます。なぜなら、 gawk ではこのような制限が初期設定されていないからです。
-W compat
--compat
    互換 モードで動作します。互換モードでは、 gawk は UNIX awk と等価な動作を行い、GNU 独自拡張は解釈できません。 詳しくは後述の GNU 拡張 を参照してください。

-W copyleft
-W copyright
--copyleft
--copyright
    GNU の著作権表示の短いバージョンを標準エラー出力へ書き出します。

-W help
-W usage
--help
--usage
    短めのオプション一覧を標準エラー出力へ書き出します。GNU コーディング規約に 従い、本オプションを指定すると gawk はただちに終了し、成功を意味する終了ステータスを返します。

-W lint
--lint
    他の AWK での処理が疑わしい、あるいは他の AWK との互換性がない構造が ある場合に警告を行います。
-W posix
--posix
    互換 モードをオンにします。以下の制約が課せられます。

    •   \x エスケープシーケンスを解釈しません。

    •   キーワード function に対応する別名 func を解釈しません。

    •   演算子 ^ や ^= のかわりに ** や **= を用いることができません。

-W source=program-text
--source=program-text
    program-text を AWK プログラムとして用います。本オプションにより、ライブラリ化された関数 ( -f または --file オプションを用いて読み込む) とコマンドラインから入力されたプログラムを 簡単に合成することができます。 これは、主にシェルスクリプトで用いられる中規模から大規模な AWK プログラム のために用意されました。

    -W source= 形式においては、 program-text より後にくる引数をプログラムへの引数として解釈します。 よって、本オプションより後に他のオプション引数を続けることはできません。

-W version
--version
    実行されたプログラムのバージョン情報を標準出力へ書き出します。これは、 あなたが使用しているプログラムが Free Software Foundation が配布している プログラムのうち、最新のものであるかどうかを知る場合に便利です。 本オプションを指定すると、GNU コーディング規約に従い、 gawk はただちに終了し、成功を意味する終了ステータスを返します。

--  オプションの終了を意味します。AWK に ``-'' から始まるオプションではない 引数を与える場合に便利です。これは、他の POSIX プログラムの多くが引数に対して 行う解釈と一貫性を保つためにあります。

互換モードでは、他のオプションは不正であるとされるか、無視されます。 通常の実行において、プログラムテキストがコマンドラインに指定されていれば、 不明なオプションは、AWK プログラムに ARGV 配列を通して渡されます。これは、 AWK プログラムを ``#!'' 機構を用いて実行する場合に便利です。

AWK プログラムの実行

AWK プログラムは、パタンとアクションの組の列と、(もし必要なら) 関数定義から なります。

    pattern    { action statements }
    function name(parameter list) { statements }

gawk はまず、 program-file が指定されていればそれから、次に、 -W source= 引数から、あるいは、最初のオプションではない引数からプログラムを読み込みます。 -f と -W source= オプションは、コマンドラインで複数回指定できます。 gawk は、すべての program-file とコマンドラインで指定したプログラムを結合して使用します。 これは、AWK 関数のライブラリを構築するのに便利です。 また、ライブラリ関数とコマンドラインで指定したプログラムとを混合して使う ことも可能にしています。

環境変数 AWKPATH により、 -f オプションで指定されたファイルを検索するパスを指定できます。 AWKPATH が設定されていない場合のデフォルトパスは ".:/usr/lib/awk:/usr/local/lib/awk" です。 -f オプションで指定したファイル名が ``/'' を含んでいる場合は、 パス検索は行われません。

gawk は、 AWK プログラムを以下の順序で実行します。

    1.  -v オプションで指定された変数への代入を全て行う

    2.  プログラムを内部構造にコンパイルする

    3.  (もし存在すれば) BEGIN ブロック (複数存在可) を実行する

    4.  配列 ARGV で指定されたファイルを読み、処理を行う (コマンドラインでファイル名が 指定されていなければ、標準入力に対して処理を行う)

コマンドラインで指定されたファイル名が var=val という形式ならば、それは変数への代入であると解釈されます。変数 var は値 val に設定されます (これは、すべての BEGIN ブロックを実行したあとに発生します)。コマンドライン での変数の代入は、AWK が入力をフィールドやレコードに分割するためのセパレータ を実行時に変更するのに便利です。また、1 つのデータファイルに 対し数回処理を行う必要がある場合、状態をコントロールするのにも便利です。

配列 ARGV の要素が空 ("") の場合、 gawk はそれを無視します。

gawk は、入力された各行にマッチする パタン が AWK プログラム内にあるかどうかを検索します。もしあれば、 マッチしたパタンに対応する アクション が実行されます。 パタンは、プログラムテキストに出現した順序で検索されます。

入力がつきると、 gawk は (もしあれば) END ブロック (複数存在可) を実行します。

変数とフィールド
AWK における変数は動的、すなわち、最初に使用されたときに生成されます。 変数の値は、浮動小数か、文字列か、あるいは両方です。変数が用い られる場所により変化します。AWK では、また配列を利用することができます。 多次元配列 も (擬似的にではありますが) 利用可能です。いくつかのあらかじめ定義された 変数は、プログラム実行開始時に設定されます。

  フィールド

入力ファイルから 1 行読み込むと、 gawk はその行を フィールド に分割します。分割する際には、変数 FS の値が参照されます。 FS の値が 1 文字なら、その文字を境にフィールドが分割されます。さもなければ、 FS は正規表現であると解釈されます。特殊な例として、 FS が単一の空白の場合には、フィールドは 連続した空白またはタブにより分割されます。変数 IGNORECASE (下記参照) の値は、 FS が正規表現の場合、フィールド分割に影響を与えることに注意してください。

変数 FIELDWIDTHS が空白で区切られた数字の列に設定されている場合、各フィールドは 固定長であると解釈されます。 gawk は指定された幅ごとにフィールドの分割を行います。この場合、 FS の値は無視されます。 FS に新たに値を設定することにより、この FIELDWIDTHS の効果を打ち消すことができます。

各フィールドの値は、左から $1, $2 などの名前で参照できます。 $0 は行全体です。フィールドに値を代入することもできます。フィールドは定数 だけでなく、変数によって参照することもできます。以下の例では、入力行の 5 番目のフィールドの値を出力します。

    n = 5
    print $n

変数 NF は、自動的にその行のフィールドの数に設定されます。

存在しないフィールド (すなわち、 $NF より右のフィールド) を参照した結果は空文字列になります。 しかしながら、存在しないフィールドへの代入 (たとえば、 $(NF+2)=5 ) は NF の値を増加させ、間のフィールドには空文字が設定されます。また、 $0 の値は、フィールドの値を変数 OFS の値で結合したものに再設定されます。 負のフィールド番号への参照は致命的エラーとなります。

  組み込み変数

AWK の組込み変数は以下のとおりです。

ARGC
    コマンドライン引数の個数 ( gawk へのオプションと、プログラム指定は含めません)。

ARGIND
    現在処理中のファイル名が格納されている配列 ARGV のインデックス。

ARGV
    コマンドライン引数の配列。配列は、 0 から ARGC - 1 までのインデックスを 持ちます。 ARGV の内容を変更することで、入力に用いるファイル名を変更することができます。

CONVFMT
    数値の変換フォーマット。デフォルト値は "%.6g" です。

ENVIRON
    現在の環境変数の値からなる配列。配列は、環境変数名によりインデックスされ ています (たとえば、環境変数 HOME は ENVIRON["HOME"] で参照できます)。本配列に代入を行っても、 gawk からリダイレクトや system() 関数により実行されるプログラムの環境には影響を与えません (これは、将来の gawk では変更される可能性があります)。

ERRNO
    getline のリダイレクト、 getline による読み込み、 close() 関数の実行時のいずれかにシステムエラーが発生した場合、変数 ERRNO にはエラーの内容を示した文字列が設定されます。

FIELDWIDTHS
    空白で区切られたフィールド長のリスト。もしこの値が設定されていれば、 gawk は FS の値を用いてフィールド分割するかわりに、固定長のフィールド分割を行います。 固定長のフィールド分割機能はまだ実験的なもので、 gawk が改良されるに従って意味が変化する可能性があります。

FILENAME
    現在の入力ファイル名。もし、コマンドラインで入力ファイルが指定されて いなければ、 FILENAME は ``-'' です。しかしながら、 BEGIN ブロック内では FILENAME は未定義です。

FNR 現在の入力ファイルのレコード番号。

FS  入力フィールドセパレータ。デフォルトでは単一の空白です。

IGNORECASE
    すべての正規表現において大文字小文字の区別を制御します。もし、 IGNORECASE が 0 以外の値に設定されていれば、ルールのパタンマッチ、 FS によるフィールド分割、 ~ と !~ つきの正規表現マッチ、定義済み関数 gsub(), index(), match(), split(), sub() では、大文字と小文字の違いは無視されます。このため、 IGNORECASE が 0 以外の値ならば、 /aB/ は "ab"、"aB"、"Ab"、"AB" のいずれにも マッチすることになります。他の AWK 変数と同様に IGNORECASE のデフォルト値は 0 なので、デフォルトでは 正規表現において大文字と小文字は区別されます。

NF  現在の入力レコードのフィールド数。

NR  現在までに読み込んだレコード数の合計。

OFMT
    数字の出力フォーマット。デフォルト値は "%.6g" です。

OFS 出力フィールドセパレータ。デフォルトは空白です。

ORS 出力レコードセパレータ。デフォルトは改行です。

RS  入力レコードセパレータ。デフォルトは改行です。 RS は例外的な変数で、値の最初の 1 文字のみがレコード分割に用いられます (これは、 将来リリースされる gawk では変更されているかもしれません)。もし RS が空文字列に設定されていたなら、レコードは空行によって分割されます。この場合、 FS の値が何であろうとも、改行はつねにフィールドセパレータとしての役割を 果たします。

RSTART
    match() によりマッチした最初の文字の位置。0 はマッチしなかったことを示します。

RLENGTH
    match() によりマッチした文字列の長さ。-1 はマッチしなかったことを示します。

SUBSEP
    多次元配列を実現する際に用いられる、配列のインデックスを結合する文字。 デフォルト値は "\034" です。

  配列

配列は、ブラケット ([ と ]) の間の式によってインデックスを指定します。もし式が式 のリスト(式, 式, ...) なら、式の値を変数 SUBSEP の値を区切りとして結合した文字列をインデックスとして用います。 これにより、多次元配列をシミュレートしています。たとえば、

    i = "A" ; j = "B" ; k = "C"
    x[i, j, k] = "hello, world\n"

は、文字列 "hello, world\n" を、文字列 "A\034B\034C" で インデックスした配列 x の要素に代入しています。AWK のすべての配列は、 文字列によりインデックスを行う連想配列です。

特殊な演算子 in を if または while ステートメントで用いることによって、あるインデックス値における 配列の値が定義されているかを調べることができます。

    if (val in array)
    	print array[val]

もし、配列が多次元インデックスを持つなら、 (i, j) in array を用います。

in はまた、 for ループ中で、配列のすべてのインデックス値を順番に取り出す場合に 用いることができます。

配列の要素は、 delete ステートメントを用いて削除することができます。 delete ステートメントはまた、配列全体を削除するのにも使えます。

  変数の型と変換

変数とフィールドは、(浮動小数の) 数値または文字列、あるいは両方が使われます。 変数の値がどのように解釈されるかは、変数の使われ方によって変化します。 数式中で用いられれば変数は数値として解釈され、文字列として用いられれ ば文字列として解釈されます。

変数の値を強制的に数値であると解釈させたい場合は、変数に 0 を加えます (var + 0)。文字列と解釈させたい場合は空文字列を結合します (var "")。

文字列を数値に変換する必要がある場合、変換は atof(3) によって行われます。数値を文字列に変換する場合は、変数 CONVFMT の値を用いて、 sprintf(3) により行われます。AWK ではすべての数値は浮動小数ですが、整数値はつねに整数 として変換が行われます。よって、以下の場合、

    CONVFMT = "%2.2f"
    a = 12
    b = a ""

変数 b は文字列値 "12" となり、"12.00" とはなりません。

gawk は、以下のようにして比較を行います: 2 つの変数が数値なら数値として比較します。 もし片方が数値で片方が`数値'文字列なら、数値として比較されます。 片方が数値でない文字列なら、数値のほうが文字列に変換され、文字列として 比較されます。両方とも文字列なら、文字列として比較されます。POSIX 標準に従う なら、両方とも数値文字列の場合は数値として比較しますが、これは明らかに 間違いです。 gawk はそのような動作をしません。

初期化されていない変数は、数値としては 0 を、文字列としては空文字列を持ちます。

パタンとアクション
awk は行指向の言語です。まずパタン、次にアクションが続きます。アクションは { と } で囲みます。パタンまたはアクションは省略することもできます。 もちろん、両方とも省略されてしまっては意味がありません。 パタンがない場合、アクションはすべての行に対して適用されます。 省略されたアクションは以下と等価です。

    { print }

これはすべての行全体を出力します。

コメントは ``#'' で始まり、行末まで続きます。空行により、複数のステートメントを 分割することができます。通常、ステートメントは改行することによっては終り ますが、``,'', ``{'', ``?'', ``:'', ``&&'', ``||'' で終る場合はこの限りでは ありません。 do または else で終わる行は、ステートメントが自動的に以降の行へ継続されます。 また、改行の直前に `\' を置くことで、行を継続することができます。 この場合、改行は無視されます。

``;'' で区切ることにより、1 行に複数のステートメントを記述することができます。 アクション部におけるステートメントだけではなく、 パタンとアクションの対自体も ``;'' で区切って複数置くことができます。

  パタン
AWK のパタンは、以下のうちのいずれかです。

    BEGIN
    END
    /regular expression/
    relational expression
    pattern && pattern
    pattern || pattern
    pattern ? pattern : pattern
    (pattern)
    ! pattern
    pattern1, pattern2

BEGIN と END は特殊なパタンであり、入力と比較されることはありません。すべての BEGIN パタンに対応したアクションは結合されます。結合されたアクションは すべての入力ファイルの読込みに先立って実行されます。同様に END ブロックは結合され、すべての入力ファイルの処理後 (あるいは、exit ステートメント が実行されたとき) に実行されます。 BEGIN と END は他のパタンと混ぜて使うことはできません。また、 BEGIN と END パタンはアクションを省略することができません。

/regular expression/ パタンでは、正規表現にマッチした行に対してアクションが実行されます。正規表現は egrep(1) と同様であり、あとに要約を示します。

関係演算では、後述するすべての演算子を用いることができます。通常、 特定のフィールドが正規表現にマッチするかどうかを調べるために用いられます ($2 ~ /foo/ 等)。

&&, ||, ! は、それぞれ C 言語での論理AND、論理OR、論理NOT と等価です。 C 言語と同様に、評価値が確定した時点で以降の評価を打ち切ります。他のパタン を結合する場合に使用することができます。他のプログラミング言語と同様、 括弧によって評価順序を変更することができます。

?: 演算子は C 言語のものと同様です。もし、最初のパタンが真なら、 テストのために 2 番目のパタンが用いられ、さもなければ 3 番目のパタンが用い られます。2 番目と 3 番目のパタンのどちらかだけが評価されます。

pattern1, pattern2 形式の式は 範囲パタン と呼ばれます。範囲パタンは、 pattern1 にマッチする行から、 pattern2 にマッチする行までのすべての行にマッチします。 この形式は、他のパタンと混合して用いることはできません。

  正規表現
awk の正規表現は egrep のものを拡張したものです。以下の構成要素から成り立っています。

c   メタキャラクタではない c にマッチする。 c

\c  リテラル文字 c にマッチする。

.   改行以外のすべての文字にマッチする。

^   行頭、または文字列の先頭にマッチする。

$   行末、または文字列の終端にマッチする。

[abc...]
    abc... のいずれかの文字にマッチする (文字クラス)。

[^abc...]
    abc... と改行以外の文字にマッチする。

r1|r2
    r1 または r2 にマッチする。

r1r2
    r1 の直後に r2 が続くものにマッチする。

r+  r の 1 回以上の繰り返しにマッチする。

r*  r の 0 回以上の繰り返しにマッチする。 r

r?  r の 0 回または 1 回の繰り返しにマッチする。

(r) r にマッチする (グループ化)。

文字列定数中で用いることができるエスケープシーケンスは、正規表現中でも 使用することができます。

  アクション
アクションは、ブレース { と } で囲みます。アクションは通常の代入、条件文、 ループ文等からなります。演算子、制御文、入出力文は C 言語とほぼ同様です。

  演算子

優先順位の高い順に AWK での演算子を示します。

= += -=
*= /= %= ^=
    代入です。純粋な代入 (var = value) と演算子付代入 (その他の形式) がサポートされています。

?:  C 言語の条件式と同様です。 expr1 ? expr2 : expr3 の形式で使います。もし expr1 が真なら式の値は expr2 になり、そうでなければ expr3 になります。 expr2 か expr3 のうち片方のみが評価されます。

||  論理 OR です。

&&  論理 AND です。

~ !~
    正規表現マッチ、否定のマッチ 注意: ~ と !~ の左辺に正規表現定数 (/foo/等) を用いてはいけません。正規表現定数は右辺にのみ置くことができます。式 /foo/ ~ exp は (($0 ~ /foo/) ~ exp) と等価であり、 これは通常意図するものとは異なります。

< >
<= >=
!= ==
    通常の関係演算子です。

blank
    文字列の結合です。

+ - 加算と減算です。

* / %
    乗算と除算です。

+ - !
    単項プラス、単項マイナス、論理否定です。

^   べき乗 (** も同様の意味で使用できる。また **= 代入演算子も存在する) です。

++ --
    インクリメントとデクリメントです。前置も後置も可能です。

$   フィールド参照です。

  制御ステートメント

制御ステートメントは以下のとおりです。

    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 }

  I/O ステートメント

入出力ステートメントは以下のとおりです。

close(filename)
    ファイルまたはパイプ (下記参照) をクローズします。

getline
    次のレコードを $0 に読み込みます。 NF, NR, FNR が設定されます。

getline <file
    ファイル file から次のレコードを $0 に読み込みます。 NF が設定されます。

getline var
    次のレコードを変数 var に読み込みます。 NF, FNR がセットされます。

getline var <file
    ファイル file から次のレコードを変数 var に読み込みます。

next
    現在のレコードに対する処理を終了し、次のレコードを読み込み、AWK プログラムの 最初のパタンから処理を開始します。もし、入力データの終端に達した場合、 END ブロックが存在すれば実行されます。

next file
    現在の入力ファイルに対する処理を終了し、次の入力レコードは 次の入力ファイルから読み込みます。 FILENAME が更新され、 FNR が 1 にリセットされ、AWK プログラムの最初のパタンから処理が開始されます。 入力データの終端に達したときは、もし END ブロックが存在すればそれが実行されます。

print
    現在のレコードを出力します。

print expr-list
    式を出力します。各式は OFS 変数の値で区切られます。出力されるレコードの最後には ORS 変数の値が付加されます。

print expr-list >file
    式をファイル file に出力します。各式は OFS 変数の値で区切られます。出力されるレコードの最後には ORS 変数の値が付加されます。

printf fmt, expr-list
    書式付き出力です。

printf fmt, expr-list >file
    ファイル file への書式付き出力です。

system(cmd-line)
    コマンド cmd-line を実行し、終了ステータスを返します (POSIX に準拠していないシステムでは 使用できない場合があります)。

その他の形式のリダイレクトとして以下のものが利用可能です。 print と printf に対して >>file を指定すると、出力はファイル file に追加されます。 | command は出力をパイプに対して行います。同様に、 command| getline はコマンドの出力から getline を行います。 getline はファイル終端では 0 を、エラー時には -1 を返します。

  printf ステートメント

AWK での printf ステートメントと sprintf() 関数は、以下の変換指定を受け付けることができます。

%c  ASCII 文字。 %c に対応する引数が数値なら、その値を ASCII コードとみなし て文字に変換する。そうでなければ、引数は文字列であると解釈され、その 1 文字目が出力される。

%d  10 進整数値

%i  %d と同じ

%e  [-]d.ddddddE[+-]dd なる形式の浮動小数

%f  [-]ddd.dddddd なる形式の浮動小数

%g  %e と %f の短いほうの形式の浮動小数。よけいな 0 は省略される。

%o  符号なしの 8 進数 (整数)

%s  文字列

%x  符号なしの 16 進数 (整数)

%X  %X と同様。ただし、 abcdef のかわりに ABCDEF を用いる。

%%  単一の文字 % 。引数は使用しない。

以下のものは、 % と上記のコントロール文字との間に置くことができる、 省略可能な追加パラメータです:

-   左寄せ

width
    フィールドが指定した幅 width になるように拡張されます。もし、 width が 0 で始まる数値の場合、 フィールドは 0 によって拡張されます。さもなければ、空白で拡張されます。 この法則は数値ではない出力にも適用されます。

.prec
    文字列の最大長、または、小数点以下の桁数を指定します。

ANSI C の printf() の動的な幅 width と精度 prec の指定機能が使用できます。幅または精度の指定部分に * を指定することで、値を printf または sprintf() への引数で指定できます。

  特殊ファイル名

入出力リダイレクトを行う場合、 gawk が特別に解釈するファイル名があります。 これらのファイル名により、親プロセスから受け継いだ ファイルディスクリプタを用いて入出力を行ったり、実行中の gawk プロセスに関する情報を得ることができます。 特殊ファイル名は以下のとおりです。

/dev/pid
    現在の gawk プロセスのプロセス ID (10 進数) を読み込むことができます。

/dev/ppid
    親プロセスのプロセス ID (10 進数) を読み込むことができます。

/dev/pgrpid
    現在の gawk プロセスのプロセスグループ ID (10 進数) を読み込むことができます。

/dev/user
    このファイルを読むことで、実行中のユーザに関する情報が得られます。 各フィールドは空白で区切られています。 $1 は getuid(2) システムコールの値、 $2 は geteuid(2) システムコールの値、 $3 は getgid(2) システムコールの値、 $4 は getegid(2) システムコールの値です。もし、さらにフィールドがあれば、 それは getgroups(2) システムコールが返すグループ ID のリストです。

/dev/stdin
    標準入力です。

/dev/stdout
    標準出力です。

/dev/stderr
    標準エラー出力です。

/dev/fd/n
    オープンされたファイルディスクリプタ n に対応しているファイルです。

エラーメッセージを出力するには、以下の方法が便利です。

    print "You blew it!" > "/dev/stderr"

あるいは、次のようにすることもできます。

    print "You blew it!" | "cat 1>&2"

これらのファイル名はコマンドラインで指定することもできます。

  数値関数

AWK は以下の定義済み数値関数を持っています。

atan2(y, x)
    y/x ラジアンの逆正接を返します。

cos(expr)
    ラジアンで与えた値の余弦を返します。

exp(expr)
    指数関数です。

int(expr)
    整数への切捨てです。

log(expr)
    自然対数関数です。

rand()
    0 から 1 の間の乱数を返します。

sin(expr)
    ラジアンで与えた値の正弦を返します。

sqrt(expr)
    平方根です。

srand(expr)
    式 expr の値を乱数生成関数の種として用います。式が指定されなかった場合は、 時刻が用いられます。直前の種の値を返します。

  文字列関数

AWK は以下の定義済み文字列関数を持っています:

gsub(r, s, t)
    文字列 t 中で正規表現 r にマッチした部分を s に置換します。置換した個数を返します。 t を指定しなかった場合は $0 が用いられます。

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)
    gsub() に似ていますが、最初にマッチした文字列のみが置換されます。

substr(s, i, n)
    文字列 s の i 文字目から n 文字の部分文字列を返します。 n が省略された場合、 i 文字目以降の部分文字列が返されます。

tolower(str)
    文字列 str をコピーし、大文字をすべて小文字に変換したものを返します。 アルファベットでない文字は変化しません。

toupper(str)
    文字列 str をコピーし、小文字をすべて大文字に変換したものを返します。 アルファベットでない文字は変化しません。

  時間関数

AWK プログラムの主な使い道の 1 つは、タイムスタンプ情報を含んだログファイルの 処理ですから、 gawk はタイムスタンプを取り出したりフォーマットするための 2 つの関数を提供します。

systime()
    エポックからの経過秒数を返します (POSIX システムでは、エポックは UTC で 1970 年 1 月 1 日 0:00 です)。

strftime(format, timestamp)
    format で指定されたように timestamp をフォーマットします。 timestamp は systime() が返す値と同じ形式でなければなりません。 timestamp が省略された 場合、現在の systime() の値が用いられます。利用可能なフォーマットについては、ANSI C の strftime() 関数の仕様を参照して下さい。パブリックドメインな strftime(3) とそのマニュアルページが gawk 一緒に配布されています。もし、 gawk を作成するためにその strftime を用いた場合は、そのマニュアルに記述されている変換書式が gawk でも利用可能です。

  文字列定数

AWK での文字列定数は、ダブルクォート (") に狭まれた文字の列です。 文字列では、C 言語のようにいくつかのエスケープシーケンスが使えます。

\\  バックスラッシュそのものです。

\a  「警告」文字です。通常は ASCII BEL 文字です。

\b  バックスペースです。

\f  改ページです。

\n  改行です。

\r  復帰 (キャリッジリターン) です。

\t  水平タブです。

\v  垂直タブです。

\xhex digits
    \x に続く 16 進数で表現された文字です。ANSI C と同様に、 \x に続くすべての 16 進数字はエスケープシーケンスの一部であるとみなされます。 たとえば、"\x1B" は ASCII ESC (エスケープ) 文字です。

\ddd
    1 桁か 2 桁か 3 桁の 8 進数で表現された文字です。たとえば、 "\033" は ASCII ESC (エスケープ) 文字です。

\c  文字 c そのものです。

エスケープシーケンスは正規表現定数内でも用いることができます (たとえば、 /[ \t\f\n\r\v]/ は空白文字にマッチします)。

関数
AWK では関数を以下のようにして定義します。

    function name(parameter list) { statements }

関数は、アクション部から呼び出されたときに実行されます。 関数呼び出しにおいて与えられた実引数が、関数宣言における仮引数に 受け渡されます。 このとき配列の場合は参照渡しが行われ、他の変数の場合は値渡しで行われます。

元々 AWK に関数は備わっていませんでしたので、局所変数の機構は不細工に なっています。局所変数は引数リストの余分な引数として宣言します。 局所変数と関数引数を区別するため、余分な空白で区切るのが慣習です。 たとえば、以下のようにします。

    function  f(p, q,     a, b) {	# a & b are local
    			..... }
    /abc/	{ ... ; f(1, 2) ; ... }

関数名のあとの左括弧は、空白を狭まずに関数名の直後に置かなければいけません。 これは、文字列結合演算子との曖昧さを生じさせないために必要です。 この制限は、前述の組み込み関数にはあてはまりません。

関数は、他の関数を呼び出したり、再帰的に自分自身を呼び出すことができます。 局所変数として用いられる関数引数は、関数起動時に空文字列、あるいは 0 に初期化されます。

function のかわりに func を用いることができます。

例
``/etc/passwd'' から全ユーザのログイン名を取り出し、ソートして出力する。
	BEGIN	{ FS = ":" }
		{ print $1 | "sort" }
ファイルの行数を数える。
		{ nlines++ }
	END	{ print nlines }
行番号をつける。
	{ print FNR, $0 }
全ファイルを通した行番号をつける。
	{ print NR, $0 }

関連項目
egrep(1), getpid(2), getppid(2), getpgrp(2), getuid(2), geteuid(2), getgid(2), getegid(2), getgroups(2)

The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.

The GAWK Manual, Edition 0.15, published by the Free Software Foundation, 1993.

POSIX 互換
gawk は最新版の UNIX awk との互換性だけでなく、POSIX 標準との互換性も追求しています。 このため gawk には以下のような機能が取り入れられています。 これらの機能は AWK 本には述べられていませんが、 System V Release 4 および POSIX 標準の awk が有している機能です。

プログラム実行前に変数代入を行う -v オプションは新しいものです。 AWK 本によれば、コマンドラインで指定された変数代入は awk が引数をファイル名としてオープンする際に行われることになります。 つまりこれは BEGIN ブロックの実行後です。しかしながら初期の頃の実装では、引数の中でファイル名に 先立って変数代入が指定されている場合には、代入は BEGIN ブロック実行の 前に 行われていました。そしてアプリケーションは、この ``特徴'' に依存する ようになりました。 awk がそのドキュメントに合うように直された時、昔の動作に依存している アプリケーションの便宜を図るためにこのオプションが加えられました。 (この仕様は AT&T および GNU の開発者達によって合意されました。)

独自機能のための -W オプションは POSIX 標準に従ったものです。

引数の列に特別なオプション ``--'' を指定すると、 gawk はそこがオプションの終わりであると解釈します。 互換モードにおいては未定義オプションは警告が出力され、それ以外のものは 無視されます。 通常の実行においては残りの引数は AWK プログラムに引き渡されます。

AWK 本は srand() の返り値を定義していません。 System V Release 4 版の UNIX awk (と POSIX 標準) では、その関数が使っている種を返します。 したがって gawk における srand() も現在の種を返すようにしてあります。

その他の新機能としては、 -f オプションの複数回使用 (MKS awk に倣いました)、 ENVIRON 配列、 エスケープシーケンス \a と \v ( gawk で最初に実装され、AT&T の awk にフィードバックされました)、 組み込み関数 tolower() と toupper() (AT&T に倣いました)、 printf における ANSI C 変換指定(AT&T 版で最初に実装されました)があります。

GNU 拡張
gawk は POSIX awk に対していくつかの拡張が行われています。 この節ではそれらについて解説します。 -W compat オプション付きで gawk を起動することによって、 ここで述べられている拡張機能をすべて禁止することができます。

gawk が持つ以下の機能は POSIX awk では使用できません。

    •   エスケープシーケンス \x 。

    •   関数 systime() および strftime() 。

    •   入出力リダイレクトで利用可能な特殊ファイル名。

    •   変数 ARGIND および ERRNO は特殊変数ではありません。

    •   変数 IGNORECASE とその副作用は利用できません。

    •   変数 FIELDWIDTHS と固定長フィールド分割。

    •   -f オプションで指定されたファイル名について行われるパス検索。 よって、環境変数 AWKPATH は特殊な変数ではありません。

    •   現在の入力ファイルに対する処理を終わらせるために使用される next file 。

    •   配列全体を削除するために使用される delete 配列 。

AWK 本は関数 close() の返り値を定義していません。 gawk の close() は、ファイルやパイプをクローズする際に呼び出す fclose(3)、 や pclose(3)、 からの返り値を返します。

オプション -W compat 付きで gawk を起動し -F オプションへの引数 fs として ``t'' を与えた場合に、 FS の値はタブ文字に設定されます。 これは少々見苦しい特殊事例ですので、デフォルトの動作としては 採用されていません。 -W posix を指定した場合にも、この動作は行われません。

歴史的機能
gawk は歴代の AWK の実装にあった 2 つの機能を備えています。 1 つめとして、組み込み関数 length() は引数無しで呼び出せるだけでなく、さらに括弧無しでも呼び出せます! したがって

    a = length

は以下の 2 例と同じです。

    a = length()
    a = length($0)

POSIX 標準ではこの機能は ``deprecated'' と注意書きされており、 gawk ではコマンドラインで -W lint を指定した場合に、この機能の使用に対して警告を出力します。

もう 1 つは、 while, for, do ループ本体の外でも continue や break ステートメントを使用できるという機能です。 伝統的な AWK の実装では、このように使用した continue ステートメントを next ステートメントと等価なものとして扱ってきました。 gawk では -W compat が指定されている場合に、この機能を使うことができます。

環境変数
環境に POSIXLY_CORRECT が存在する場合には、 gawk はコマンドラインで --posix が指定されている時と全く同じ動作をします。 このとき --lint が指定されていると gawk はこの作用についての警告メッセージを出力します。

バグ
コマンドラインでの変数代入機能を使用するには、変数への代入を直接 コマンドラインに書けばよく、 -F オプションをつける必要はありません。 このオプションは昔の awk との互換性のためだけに残されています。

ファイル /dev/fd および /dev/stdin, /dev/stdout, /dev/stderr を実際にサポートしているシステムでの gawk からは、それらがないシステムとは違った出力が得られるかもしれません。 gawk はそれらのファイルを内部で解釈する際に標準出力への出力を /dev/stdout への出力と同期させますが、それらのファイルを持つシステムでは 出力はそれぞれ異なるファイルへ向けられます。 利用者の方で気を付けるようにしてください (Caveat Emptor)。

バージョン情報
このマニュアルは gawk バージョン 2.15 について書かれています。

バージョン 2.11 にあったオプション -c, -V, -C, -a, -e は、バージョン 2.15 以降では使用できません。 次のメジャーバージョンのマニュアルでは、この事実の記述さえ無くなるでしょう。

作者
UNIX awk の最初のバージョンは、AT&T ベル研究所の Alfred Aho と Peter Weinberger および Brian Kernighan によって設計、実装されました。 Brian Kernighan はその保守と改良を続けています。

Free Software Foundation の Paul Rubin と Jay Fenlason が、Seventh Edition UNIX で配布された最初のバージョンの awk と互換性を持つように gawk を書きました。 John Woods は数々のバグ修正を送って下さいました。 David Trueman は、Arnold Robbins が送って下さった内容をもとに、 gawk を新バージョンの UNIX awk 互換にしました。 現在は Arnold Robbins がメンテナンスを行っています。

DOS への最初の移植は Conrad Kwok と Scott Garfinkle によって 行われました。 現在は Scott Deifik が DOS 版の保守をしています。 Pat Rankin は VMS への移植を行い、Michal Jaegermann は Atari ST への 移植を行いました。 OS/2 への移植は Kai Uwe Rommel が Darrel Hankerson の助けを借りて 行いました。

バグレポート
もし gawk のバグを見つけた場合は、電子メールを bug-gnu-utils@prep.ai.mit.edu へ、 arnold@gnu.ai.mit.edu へのカーボンコピー付で送って下さい。 OS とそのバージョン、 gawk のバージョン、 gawk をコンパイルした C コンパイラは何か、 その問題を再現可能なできるだけ小さいテストプログラムとデータもつけてください。

バグレポートを送る前に、2 つのことをして下さい。 1 つは、 gawk の最新バージョンで試して下さい。 多くのバグ (たいていは小さなバグ) はリリースのたびに修正されており、 あなたが使っているものが古いものであれば、その問題はすでに解決している 可能性があります。 もう 1 つは、man page とリファレンスマニュアルを読んで、 あなたがバグと考えているものが本当にバグかどうかを調べて下さい。

謝辞
ベル研究所の Brian Kernighan はテストおよびデバッグの間、貴重な助力を 提供して下さいました。感謝致します。