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 にもとづいており、UNIX awk の System V Release 4 バージョンの拡張も含んでいます。 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 34B 34C" でインデック スした配列 x の要素に代入しています。AWK のすべての配列は、文字列によりイ ンデックスを行う連想配列です。

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

    if (val in array)
    	print array[val]

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

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

    for (i in array)
    	print array[i]

配列の要素は、 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 パタンはアクションを省略することが できません。

/reglar 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 での演算子を示します。

= += -=
*= /= %= ^=
    代入

?:  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 }

  入出力ステートメント

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

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

getline
    次のレコードを $0 に読み込む。 NF 、 NR 、 FNR がセットされる。

getline <file
    ファイル file から次のレコードを $0 に読み込む。

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

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

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

next file
    現在のレコードに対する処理を終了し、次のレコードが 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 プログラムの主要なユーザはタイムスタンプを含んだログファイルのよう なものを処理するので、 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.