移動先 先頭, , , 末尾 セクション, 目次.

gawk に関するまとめ

この付録にはgawkのコマンドラインと、gawk言語の要約がある。これ は"クイックリファレンス"としてデザインされたものである。簡潔ではあるけれど も、抜けはない。

コマンドラインオプションのまとめ

コマンドラインはgawk自身へのオプションと、awkプログラムのテキ スト(`-f'オプションが指定されていない場合)、そしてあらかじめ定義されて いるawkの変数、 ARGCARGVに反映される値からなる。

gawk [POSIX or GNU style options] -f source-file [--] file ...
gawk [POSIX or GNU style options] [--] 'program' file ...

gawkが受け付けるオプションは以下の通り。

-F fs
--field-separator fs
fsを入力フィールドセパレータとして使用する(あらかじめ定義されてい る変数FSの値となる)
-f program-file
--file program-file
awkプログラムのソースを、最初のコマンドライン引数ではなくpro gram-fileから読み取る。
-mf NNN
-mr NNN
`f'フラグはフィールドの最大数をセットし、`r'フラグは最大レコー ドサイズをセットする。これらのオプションは、gawkがこれら数字に関 してのあらかじめ決まった限界値を持っていないので、gawkでは無視さ れる。これはBell研究所のUNIXバージョンのawkに対する互換性のためだ けにある。
-v var=val
--assign var=val
プログラムが実行される前に、変数varvalという値をセットする。
-W traditional
-W compat
--traditional
--compat
gawkの拡張機能を禁止する互換モードを使用する。
-W copyleft
-W copyright
--copyleft
--copyright
ショートバージョンの 一般公有許諾書(Geneal Public Licence)を標準エラー出力に 出力し、実行を終了する。 このオプションは将来のgawkではなくなるかもしれない。
-W help
-W usage
--help
--usage
使用可能なオプション一覧を標準エラー出力に出力し、実行を終了する。
-W lint
--lint
疑わしかったり、移植性に欠けるawkプログラムの部分に対して警告を発 する。
-W lint-old
--lint-old
オリジナルの UNIX Version7上のawkで使えない機能に対して警告を発す る。
-W posix
--posix
gawk特有の拡張機能を禁止し、さらに幾つかの制限を 追加する。
-W re-interval
--re-interval
正規表現にinterval expressionを使うことを許可する (セクション 正規表現演算子を参照)。
-W source=program-text
--source program-text
awkプログラムのソースコードとしてprogram-textを使う。このオプシ ョンはコマンドライン上に置かれたソースコードとファイル中のソースコードを 一緒に使うことを許し、特にコマンドライン上のプログラムからライブラリ関数を 使うときに便利である。
-W version
--version
使用しているgawkに関するバージョン情報を標準エラー出力に出力する。
--
オプションの終わりを示す。これはawkプログラム自身に `-'で始まる引数を渡すのに便利である。 これはPOSIXの引数解析の規約に従っている。

以上のもの以外のオプションは不正なものであるが、無視される。 詳しくはセクション コマンドラインオプションを参照。

言語のまとめ

awkプログラムは、パターン・アクションの並びと (省略可能な)関数の定義 から構成される。パターンかアクションのいずれかを省略することもできる。

pattern    { action statements }
pattern
          { action statements }

function name(parameter list)     { action statements }

gawkは最初に、ソースプログラムをコマンドラインで指定されていれば program-fileから、そうでなければオプションでない最初の引数から読み 込む。 `-f'オプションはコマンドラインで複数回使うこともできる。 gawkはすべてのprogram-fileファイルからプログラムを読み込む(こ のとき、指定された順番通に行なわれる)。このような動作はawk関数のライ ブラリを作成するのに有効であり、新しくawkプログラムを書くたびにそういっ たライブラリを直接プログラム中にいちいち書かないで良い。コマンドライン上でタ イプされたライブラリ関数を使うには、コマンドライン上に`-f /dev/tty'を書 いてそのあとにプログラムをタイプし、 Control-dで終れば良い セクション コマンドラインオプションを参照。

環境変数AWKPATH`-f'で指定したファイルを探すパスを指定する。 AWKPATHがセットされていないときには、デフォルトのパスである `.:/usr/lib/awk:/usr/local/lib/awk' (27) が使われる。 `-f' で指定したファイル名に`/'が含まれていた場合には、パスを使った サーチは行なわれない セクション AWKPATH環境変数を参照.。

gawkはプログラムを内部形式にコンパイルし、ARGVという配列中 のファイルから読み込みを行なう。もし、ファイルがコマンドラインで指定され ていなければ、gawkは標準入力から読み込みを行なう。

もしコマンドラインで "ファイル"が`var=val'という形であれ ば、それはvarvalを代入するという代入式として扱われる。 ARGVの ある要素が空文字列であれば、その要素はスキップされる。

入力された行ごとに、gawkawkプログラム中のパターンとマッチ するかをテストし、適用すべきアクションを実行する。

変数とフィールド

awkの変数は(使用する前に)宣言する必要はなく、最初に使用されるとき に作り出される。その値は浮動小数点数か文字列かのいずれかである。 awk はまた、一次元の配列を持ち、多次元配列をエミュレートする。 awkが 実行時にあらかじめ決められた値をセットするようないくつかの変数があるが、 それはこのあとで説明する。

Fields

行が読み込まれるごとに、gawkはフィールドセパレータにFS の値を使って行をフィールドに分割する。 FSが一つのキャラクタ であれば、フィールドはそのキャラクタで分割される。そうでない場合、FS は正規表現であるとみなされる。特殊なケースとして、FSが一つの空白で あった場合には、フィールドは空白、タブ、改行のいずれか、あるいはそのすべて で分割される。(28) また、FSが空文字列("")であった場合には、レコード の各キャラクタが別々のフィールドとなる。 IGNORECASE (セクション 大小文字を区別するマッチングを参照) の値はFSが正規表現であるときに、どのようにフィールドが分割 されるかに影響を与える。

入力行のフィールドはそれぞれ、その(入力行中の)位置で参照することができ、 $1, $2のように記述する。 $0は行全体である。フィールドの 値は代入することもできる。フィールド番号は定数でなくてもよく、

n = 5
print $n

上記のプログラムは入力行の5番目のフィールドを出力する。NFという変数 には入力行にあるフィールドの数がセットされる。

存在しないフィールド($NFより後ろのフィールド)を参照すると空文字列 が返ってくる。しかし、存在しないフィールドに対して代入を行うと(例えば $(NF+2) = 5)、NFの値を増やし、間にあるフィールドを空文字列で 作成し、さらに$0を、OFSの値をフィールドセパレータとして再 構成する。 NFを減じることによって、それによって範囲からはみ出たフィールドの 値が失われることになり、さらに$0の値がOFSによって区切られ ているフィールドの集合として再構成される。 セクション 入力ファイルの読み込みを参照.

Built-in Variables

gawkの組込み変数には以下のものがある。

ARGC
ARGVの要素の数。ARGVに実際に含まれるのものについては 後述する。
ARGIND
現在処理しているARGVの要素へのインデックス。`FILENAME == ARGV[ARGIND]'が 常に成り立つ。
ARGV
コマンドライン引数の配列。配列の添え字は0からARGC - 1まで。 ARGVの内容を動的に変更する事によって、データとして使うファイルを制御 することができる。ARGVの空の要素は無視される。ARGVには awkに対するオプションや、awkプログラムそのものには 含まれていない。
CONVFMT
数値を文字列に変換するときに使われるフォーマット。
FIELDWIDTHS
固定長の入力データを記述する数字の、スペースで区切られたリスト。
ENVIRON
環境変数からなる配列。配列の添字は環境変数名で、配列要素の値は(添字に使われ ている)環境変数の値である。したがって、環境変数HOMEの値は ENVIRON["HOME"] とすることで取得できる。その値は`/home/arnold' といった形式であろう。 この配列を変更しても gawkがリダイレクションやsystem関数で起動 したプログラムが参照する環境変数には影響しない (これは将来のgawkで は変わるかもしれない)。 一部のオペレーティングシステムでは環境変数がない。そういったシステムでは ENVIRONは実行時には空となる。
ERRNO
getlinecloseを実行したときに起きたエラーのシステムエラーメッ セージ。
FILENAME
現在の入力ファイルのファイル名。コマンドラインで入力ファイルの指定がされてい ないときには、FILENAMEは空文字列である。
FNR
現在の入力ファイルから入力したレコードの数。
FS
入力フィールドセパレータ。デフォルトではブランク。
IGNORECASE
正規表現オペレーション時に大小文字を区別するかどうかのフラグ。 IGNORECASEに0でない値が設定されていると、ルールのパターンマッチン グ、RSによるレコード分割、FSによるフィールド分割、`~'`!~'による正規表現マッチングや、gsub, index, match, split, sub といった組込み関数の全て正規表現オ ペレーション時や文字列比較の際に大小文字を無視する。 IGNORECASEの値は、配列の添え字付けには影響しない。
NF
カレント入力レコードのフィールドの数。
NR
現在まで入力されたレコード数の合計。
OFMT
print 文で数値を出力するときのフォーマット。 デフォルトでは"%.6g"
OFS
出力フィールドのセパレータ。デフォルトではブランク。
ORS
出力レコードのセパレータ。デフォルトでは改行。
RS
入力レコードセパレータで、デフォルトでは改行。RSが空文字列であれ ば、レコードは空行によって分割される。RSが空文字にセットされたと き、改行キャラクタは FSに設定されている値に加えて、常にフィールド セパレータとして振る舞う。RSに複数のキャラクタがセットされている 場合、それは正規表現として扱われ、入力テキストは正規表現にマッチしたとこ ろでレコードに分割を行う。
RT
RSで示されたテキストにマッチし、 レコードセパレータとなった入力テキスト。
RSTART
matchでマッチした文字列の先頭の位置。マッチしなかったときには0が入る。
RLENGTH
matchでマッチした文字列の長さ。マッチしなかったときは-1が入る。
SUBSEP
多次元配列の要素の添え字を区切るのに使用される文字列。デフォルトでは "\034"である。

詳しい説明はセクション 組み込み変数を参照. にある。

Arrays

配列はブラケット(`['`]')に囲まれた式によって添え字付けされる。 配列の添え字は常に文字列であり、数値は必要に応じて以下の変換ルールに 従って文字列に変換される (セクション Conversion of Strings and Numbersを参照)。

ブラケットの内側でカンマで区切られた複数の式を使った場合、配列の添字は添字の 区切り(SUBSEPの値)によって区切られた文字列に変換され、それを内部的な 添字の値とする。

特殊な演算子inif文やwhile文のなかで配列中に含まれる特 定の値を取り出すために使われる。

if (val in array)
        print array[val]

配列が多次元の添字を持っていたならば、(i, j, ...) in arrayを存在 する要素のテストのために使用する。

inforループのなかで、配列要素すべてに対する繰り返しを行なう ときに使うことができる。 セクション Scanning All Elements of an Arrayを参照.

delete文を使って配列要素を配列から削除することができる。

`delete array'を使って、配列全体をクリアすることができる。

セクション awkにおける配列を参照.

Data Types

awkでの式の値は常に数値か、文字列のいずれかである。

一部の(算術演算子のような)文脈では数値が要求される。 そのような文脈では数字のならんだ文字列のテキストに対して、 インタープリタが文字列から数値への変換を行う。 もし、変換対象となった文字列が数値のようなものでなければ、 0に変換される。

その他の文脈(連接のような)では、文字列値が要求される。 数値データであればsprintfで 出力したような文字列に変換される。 詳しくは セクション Conversion of Strings and Numbersを参照.

強制的に文字列データを数値に変換するには、単に0を加えれば良い。ただし、文字 列がすでに数値データである場合には変換動作は行われない。

逆に強制的に数値データを文字列に変換するには、空文字列を連結すれば良い。

awk言語ではオペランドが両方とも数値であるか、少なくとも一方が数値 で、他方が数値文字列であれば数値として比較を行なうように定義している。そ うではなく、少なくとも一方のオペランドが文字列に変換されていたら文字列同 士の比較が行なわれる。フィールド、!code{getline}による入力、FILENAMEARGVの要素、ENVIRONMETの要素、splitによって作 成された配列の要素といったものだけが、数値文字列となることができる。 "3.1415927"のようなものは、数値文字列ではなく文字列である。 比較の際のルールは セクション Variable Typing and Comparison Expressionsを参照. で全て説明されている。

初期化されていない変数は文字列値""(空文字列)を持つ。数値が要求され る文脈では0に等しい。

変数の名前付けと初期化についてはセクション Variablesを参照、 変数の値がどのように解釈されるかは セクション Conversion of Strings and Numbersを参照。

パターン

awkプログラムは、その大部分がアクションが後に続いているパターンか ら構成されるルールからなる。アクションは`{'`}'に囲まれて いる。アクションかパターンのどちらかを省略する事ができる(もちろん両方を 省略するという事はできない)。パターンが省略されると、全ての入力に対して アクションが実行される。アクション部が省略された場合には、行全体を出力す る`{ print }'と同じことになる。

コメントは`#' で始まり、行末まで続く。空行は文の区切りのために使われる だろう。通常は文の終わりは改行であるけれども、`,', `{', `?', `:', `&&', `||'が行の最後にきているときにはその限 りではない。また、do あるいは elseが行末にきている場合、自動的 に次の行以降に対応する文があるとみなされる。別のケースとして、行末に改行を無 視するための`\'がある場合、行が継続しているものとみなされる。

マルチステートメントは同一行上で`;'を使って文を区切る事で使う事ができる ようになる。これはルールのアクション部(通常の場合)ステートメントと、ルール 部のステートメントの両方に適用できる。

awkコメントについてはセクション awkプログラム中のコメントを参照.に、 awkの行継続のメカニズムについては セクション awk の文と行を参照.に 説明されている。

Pattern Summary

awkでのパターンは次のうちのいずれか一つである。

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

BEGINENDは、入力に対してテストを行わない特殊なパターンであ る。全てのBEGINルールのアクション部分はあたかも一つのBEGIN ルー ルで記述されたかのようにまとめられ、入力を開始する以前にルールの実行が行われ る。同様に全てのENDもまとめられて、入力が全て終了したとき(もしくは exit 文が実行されたときに)ルールの実行が行われる。 BEGINENDの二つのパターンはもう一方のパターンと一緒にされる事はない。 BEGIN パターンも ENDパターンもアクション部の省略はできない。

`/regular-expression/'というパターンは各入力行に対して正規表現が マッチするかどうかを実行する仮想的な(?)文である。正規表現はegrepの拡 張になっており、以下に挙げられる通りである。

relational expressionは以下で定義される演算子を、アクション中で使うこ とができる。これらは通常あるフィールドとある正規表現がマッチするかをテストす る。

`&&', `||', `!'といった演算子はそれぞれ、 Cと同じ様に論理積、 論理和、論理否定の演算子である。これらの演算子はまた、これもCと同じ様に式の 評価をするときにショートサーキット評価を行う。また、これらの演算子を組み合 わせて式を構成する事もできる。多くの言語でそうであるように、括弧を式の評価 の順序を変更するために使う事ができる。

`?:'という演算子はCでのそれと同じである。最初のパターンにマッチすると、 入力レコードに対して二番目のパターンが適用され、そうでなければ三番目のパタ ーンが適用される。二番目か、三番目のいずれか一つだけが適用される。

`pattern1, pattern2'の様な形式のパターンは範囲指定パターン と呼ばれる。このパターンはpattern1にマッチした行からpattern2にマッ チした行まで(pattern2も含まれる)の全ての行にマッチする。範囲指定パター ンは他のパターンのオペレータとして使用する事はできない。

セクション Pattern Elementsを参照.

Regular Expressions

正規表現はPOSIXの拡張正規表現に基づいている。エスケープシーケンスは文字 列定数や正しい正規表現定数の中に含めることができる(セクション エスケープシーケンスを参照)。 正規表現は以下に挙げるキャラクタの組み合わせである。

c
cというキャラクタにマッチする(ここで、cが 以下に挙げるキャラクタリストに含まれていないものとする)。
\c
cというキャラクタそのものにマッチする。
.
改行も含めて、任意のキャラクタにマッチする。 厳密なPOSIXモードでは、`.'は ビットが全て0であるNULキャラクタにはマッチしない。
^
文字列の先頭にマッチする。
$
文字列の末尾にマッチする。
[abc...]
abc...(キャラクタリスト)のいずれかのキャラクタにマッチする。
[[:class:]]
classというキャラクタクラスに含まれる任意のキャラクタに マッチする。使用できるキャラクタクラスには、 alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigitがある。
[[.symbol.]]
マルチキャラクタの照合シンボルsymbolにマッチする。 gawkは現在この照合シンボルをサポートしていない。
[[=classname=]]
カレントのロカールにおいてclassnameという名前の クラスに含まれる等価のキャラクタにマッチする。 gawkは現在この等価クラスをサポートしていない。
[^abc...]
abc...の中にない任意のキャラクタに マッチする(キャラクタリストの補集合)。
r1|r2
r1もしくはr2にマッチする(選択)。
r1r2
r1r2という並びにマッチする(連結)。
r+
rの一回以上の繰り返しにマッチする。
r*
rのゼロ回以上の繰り返しにマッチする。
r?
ゼロ個、もしくは一個のrとマッチする。
(r)
rにマッチする(グルーピング)。
r{n}
r{n,}
r{n,m}
それぞれ、rn回の繰り返し、n回以上の繰り返し、 nからm回までの繰り返しにマッチする(interval expression)。
\y
ある単語の先頭、もしくは末尾にある空文字列にマッチする。
\B
単語中にある空文字列にマッチする。
\<
ある単語の先頭にある空文字列にマッチする。
\>
ある単語の末尾にある空文字列にマッチする。
\w
単語を構成するキャラクタ(アルファベット、数字とアンダースコア)に マッチする。
\W
単語の構成要素にならないキャラクタにマッチする。
\`
バッファ(gawkでの文字列と同じようなもの)の先頭にある空文字列と マッチする。
\'
バッファの末尾にある空文字列とマッチする。

gawkが正規表現中にあるキャラクタをどのように 解釈するかを制御するコマンドラインオプションが幾つかある。

No options
デフォルトでは、前述したgawkはPOSIXの正規表現演算子と GNUの正規表現演算子のすべての機能を提供する。 しかし、interval expressionはサポートされない。
--posix
POSIXの正規表現のみをサポートする。GNUの演算子は特殊なものではなく(例え ば`\w'`w'という文字そのものにマッチする)、interval expressionを使うことができる。
--traditional
伝統的なUNIXawkの正規表現がマッチする。GNUの演算子は特別でなく、 interval expressionとPOSIXのキャラクタクラス([[:alnum:]]など)も使 用不可である。八進や十六進のエスケープシーケンスで表わされたキャラクタは、 それが正規表現のメタキャラクタであってもキャラクタそのものとして扱われる。
--re-interval
正規表現中でinterval expressionを使うことを許可する。 これは`--traditional'が指定されているときも有効である。

セクション 正規表現を参照.

アクション

実行文(action statement)はブレース(`{'`}')に囲まれている。 省略された実行文は`{ print }'と等価である。

他の多くの言語と同じように、実行文は通常、代入文、条件文、ループなどから なる。演算子、制御文、入出力文はCと同じ様に記述できる。

コメントは`#' で始まり、行末まで続く。空行は文の区切りのために使われる だろう。通常は文の終わりは改行であるけれども、`,', `{', `?', `:', `&&', `||'が行の最後にきているときにはその限 りではない。また、do あるいは elseが行末にきている場合、自動的 に次の行以降に対応する文があるとみなされる。別のケースとして、行末に改行を無 視するための`\'がある場合、行が継続しているものとみなされる。

マルチステートメントは同一行上で`;'を使って文を区切る事で使う事ができる ようになる。これはルールのアクション部(通常の場合)ステートメントと、ルール 部のステートメントの両方に適用できる。

awkコメントについてはセクション awkプログラム中のコメントを参照.に、 awkの行継続のメカニズムについては 説明されている。

演算子

awkの演算子を、優先順位の高い順に挙げる。

(...)
グルーピング
$
フィールドの参照。
++ --
インクリメントとデクリメント。それぞれ前置と後置がある。
^
べき乗(`**'を使うこともできる。`**='という代入演算子もあるが これらはPOSIXの標準では規定されていない)。
+ - !
単項のプラス、単項のマイナス、論理否定。
* / %
乗算、除算、剰余
+ -
加算と減算
space
文字列連接
< <= > >= != ==
関係演算子
~ !~
正規表現のマッチ、非マッチ
in
Array membership.
&&
論理的な"かつ"。
||
論理的な"または"
?:
条件式。これは expr1 ? expr2 : expr3の様に 記述される。 expr1が真であれば式の値はexpr2に、そうでなければ expr3になる。expr2expr3のうち、どちらか一つだけが評価 される。
= += -= *= /= %= ^=
代入。通常の代入文(var=value)と代入演算子 (それ以外のもの)の両方がサポートされている。

セクション を参照.

制御文

制御文には以下に挙げるものがある。

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 Statements

入出力文には以下のものがある。

getline
次の入力レコードを$0にセットする。 NF, NR, FNRが 再設定される。 セクション getlineを使った入力を参照.
getline <file
fileの次の入力レコードを$0にセットし、NFが再設定される。
getline var
次の入力レコードをvarにセットし、同時にNR, FNR が再設定 される。
getline var <file
fileの次の入力レコードをvarにセットする。
command | getline
commandを実行し、その出力をgetlineへパイプを通して送る。 そのとき$0, NF, NRが再設定される。
command | getline var
commandを実行し、その出力をgetlineへパイプを通して送る。 varが再設定される。
next
現在の入力レコードに対する処理を中断する。次の入力レコードを読み込み、(その レコードに対して)awkプログラムの最初のパターンから処理を始める。入力 データがファイルの終端に達したならばEND ルールが実行される セクション The next Statementを参照。
nextfile
カレント入力ファイルの処理を中止する。次の入力レコードは次の入力ファイル から読み込みが行われる。FILENAMEは更新され、FNRは1にリセッ トされ、ARGINDはインクリメントされる。また、新たな入力レコードは awkプログラムの最初のパターンから処理が開始される。入力データが終 わりに達した場合、(もしあれば)ENDルールが実行される、以前のバージ ョンのgawkではnext fileを使っていた。これは現バージョンで も使えるが好ましくない。 セクション The nextfile Statementを参照.
print
カレントレコードを出力する。 セクション 出力を行うを参照.
print expr-list
式を出力する
print expr-list > file
式をfileに対して出力する。もしfileが存在していなければ 作成され、既に存在していた場合にはファイルの容が 最初にそのprint文が実行されたときに削除される。
print expr-list >> file
式をfileに対して出力する。以前のfileの内容は残され、 printによる出力はファイルに追加する形で行われる。
print expr-list | command
式を出力し、それをcommandにパイプを通して送る。 パイプラインはclose関数が呼び出させるまで存在し続ける。
printf fmt, expr-list
整形して出力する。
printf fmt, expr-list > file
整形し、出力をfileに行う。fileが存在しない場合には 作成される。すでに存在していた場合は最初にprintfが実行された ときにファイルの内容が削除される。
printf fmt, expr-list >> file
整形し、出力をfileに行う。fileの以前の内容は残され、 printfの出力はファイルに追加される。
printf fmt, expr-list | command
整形して出力し、その出力をcommandにパイプを通して送る。 パイプラインはclose関数が呼び出させるまで存在し続ける。

getline は、ファイルの終端に達したときに0を返し、エラーが発生した 場合には-1 を返し、ERRNOにエラーの内容を示す(システム依存 の)文字列を格納する。

printf Summary

変換指定は次のような形式である。 %[flag][width][.prec]format. ここで、ブラケットに囲まれているアイテムは省略可能である。

awkprintf 文とsprintf関数は 以下にあるような変換指定の書式を受け付ける。

%c
一文字のASCIIキャラクタ。数値データに対して使われるとその数値をキャラクタコ ードとみなして対応するキャラクタを出力する。そうでない場合は対応する引数を文 字列とみなし、その先頭の文字を出力する。
%d
%i
10進数値(の整数部分)
%e
%E
`[-]d.dddddde[+-]dd' の形式の浮動小数点数値。`%E'の場合は、 `e'の代わりに`E'を使う。
%f
[-]ddd.dddddd. の形式の浮動小数点数値。
%g
%G
`%e'`%f'で変換後の文字列の長さが短い方を使用して変換し、同時に 0抑制を行う。`%G'`%e'ではなく`%E'を使用する。
%o
符号なしの8進数値(繰り返すが、整数部分)
%s
文字列
%x
%X
符号なしの16進数値(整数)。 `%X'`a'から`f'ではなく`A' から`F'を 使って10進の10から15を表す。
%%
文字としての`%'。引数の変換は行わない。

以下のものはオプションである。 付け加えられたパラメータは、`%'と制御文字の間に置かれる。

-
式をフィールド中で左寄せする。
space
数値変換において、それが正の数値であればスペースを前置し、 負の数であればマイナス記号を前置する。
+
プラス記号は修飾子(後で説明する)の前に置いて、 数値変換の際に、その結果が正であったとしても符号を常に置くように 指定する。`+'はスペース修飾子による指定をオーバーライドする
#
制御文字に応じたフォームを提供する。 `o'に対してはゼロを前に置き、`x'`X'に対しては 非0を出力するときに`0x' or `0X'を前置する。 `e'`E'`f'では、その結果に常に小数点がある ようにする。`g'`G'の場合は結果から末尾のゼロ(の連続)を 削除しないようにする。
0
前置された`0'はフラグとして作用し、出力のパディングをスペースではなく `0'で行うように指示する。これは非数値の出力書式の場合でも 適用される。このフラグはフィールド幅が出力される値の幅よりも 大きい場合にのみ効果がある。
width
フィールドの幅を指定する。widthが0で始まっていればフィールドの空いて いる部分は0で埋められ、そうでなければ空白で埋められる。
.prec
出力を行うときの数値の精度を指定する。 `e', `E', and `f'書式指定に使用した場合には 小数点以下の桁数を指定する。`g', `G' で使用した場合には 有効桁数の最大桁を指定する。 `d', `o', `i', `u', `x', `X'で使用した場合には 出力する数値の最少桁数を指定する。`s'の場合は、 出力する文字列の最大キャラクタ数を指定する。

widthprecのどちらか、もしくは両方の値を`*'を使って指定す る事ができる。この場合、実際の値は引数リストから取得される。

セクション Using printf Statements for Fancier Printingを参照.

Special File Names

入出力のリダイレクトをprintprintfを使ってファイルに行った り、getlineを使ってファイルから入力する際に gawkはある特殊なファ イル名を内部的に認識する。これらのファイル名はgawkを呼出したプロセス (通常はシェル)から受け継いだファイルディスクリプタをアクセスできる。そして、 そのファイル名には以下のものがある。

`/dev/stdin'
標準入力。
`/dev/stdout'
標準出力。
`/dev/stderr'
標準エラー出力。
`/dev/fd/n'
ファイルディスクリプタnで表されるオープンされているファイル。

以上のものに加えて、以下に挙げるファイルを読むことによって、 gawkを実行しているプロセスに関連する情報を取得することができる。 全ての返されてきたレコードは改行で終端されている。

`/dev/pid'
カレントプロセスのプロセスIDを返す。
`/dev/ppid'
カレントプロセスの親プロセスIDを返す。
`/dev/pgrpid'
カレントプロセスのプロセスグループIDを返す。
`/dev/user'
少なくともgetuid, geteuid, getgid, getegidの 四つのシステムコールの値をスペースで区切られたフィールドに置いて返す。も し追加されたフィールドがあるなら、それはgetgroupsシステムコールが 返したグループIDである(マルチプルグループは全てのシステムでサポートされ てはいない)。

これらのファイルの名前はコマンドライン上でデータファイルの名前のように使われ るだろう。その名前はあなたの使うシステムで実際に使用できる名前でなければ単に 内部的に認識されるだけである。

この機能を追加するきっかけは セクション Special File Names in gawkを参照 に詳しく説明されている。

Built-in Functions

awkは数値演算や、文字列処理、入出力に関する操作を行う組込みの関数を 多く持っている。

組込みの数値関数は以下に挙げる通り。

atan2(y, x)
y/x のアークタンジェントを返す(単位はラジアン)。
cos(expr)
exprの余弦を返す(単位はラジアン)。
exp(expr)
べき乗の関数 (e ^ expr)。
int(expr)
整数の丸めを行う。
log(expr)
exprの自然対数を求める。
rand()
0から1の間の乱数を返す
sin(expr)
exprの正弦を返す(単位はラジアン)
sqrt(expr)
平方根を求める関数である。
srand([expr])
exprを新しい乱数源として使用する。exprを省略した場合は 実行時の時刻を使用する。戻り値は以前の乱数源である。

awkには以下の文字列操作を行う組み込み関数がある。

gensub(regex, subst, how [, target])
how`g'`G'で始まる文字列であった場合、target中 のregexにマッチする各部分をsubstに置き換える。それ以外の場合 にはhow番目で置き換えを行う。targetが省略された場合には $0が使われる。関数の戻り値は変更された文字列であり、オリジナルの targetは変更されない。subst中では、`\n'の表記を使 って(nは1から9まで)n番目にマッチした(括弧でくくられた)部分文 字列を使うことができる。この関数はgawkに固有のものである。
gsub(regex, subst [, target])
文字列target中で正規表現regexに一致する部分文字列をsubst に置換し、置換した回数を返す。targetが省略されると$0が使われる。
index(str, search)
文字列strでの文字列searchの位置を返す。strが見つからない 場合には0が返る。
length([str])
文字列strの長さを返す。もし、引数が省略されると$0の長さを返す。
match(str, regex)
str中で正規表現regexにマッチする位置を返すが、 マッチしない場合には0が返される。RSTARTRLENGTHにも それぞれ値がセットされる。
split(str, arr [, regex])
正規表現rを区切りとして、文字列strを分解し配列arrに格 納する。関数の戻り値としてフィールドの数が返る。rexgeが省略された 場合、FSが区切りとして使用される。regexは空文字列であっても よく、その場合には個々のキャラクタが配列要素となる。配列arrは最初 にクリアされる。
sprintf(fmt, expr-list)
expr-listfmtに従って整形し、その結果の文字列を返す。
sub(regex, subst [, target])
これはgsubと似ているが、最初に一致した部分文字列だけが置き換えられる。
substr(str, index [, len])
si番目から始まる長さn文字の部分文字列を返す。 nが 省略されると、sの終端までが返される。
tolower(str)
文字列str中の英大文字を小文字に置き換えた文字列を返す。アルファベット 以外の文字はそのままである。
toupper(str)
文字列str中の英小文字を大文字に置き換えた文字列を返す。アルファベット 以外の文字はそのままである。

入出力に関連した関数は以下の通り。

close(expr)
exprが表す(オープンされている)ファイルもしくはパイプをクローズする。
fflush([expr])
exprで指定される出力ファイルやパイプの出力バッファをフラッシュする。 exprが省略された場合、標準出力がフラッシュされる。exprが空文 字列""であった場合、すべての出力バッファがフラッシュされる。
system(cmd-line)
コマンドcmd-lineを実行し、その終了ステータスを返す。使用しているオ ペレーティングシステムがsystemをサポートしていないと、呼び出しを 行ったときに致命的エラーが発生する。 `system("")' は強制的にawkに出力をフラッシュさせる のに遣うことができる。これはfflushを呼び出すよりも ポータブルではあるが、(出力をフラッシュするという目的が)明らかでない。

Time Functions

次に挙げる二つの関数は現在の時刻を取得し、整形することができる。 これらの関数はgawkに固有のものである。

systime()
ある時刻(POSIX systemsのシステムでは1970年1月1日午前0時(UTC))から 現在までの経過秒数を返す。
strftime([format[, timestamp]])
timestampformatの指定に従ってフォーマットする。 timestampが渡されなかった場合には、実行時の日時が使用される。 formatがないときのデフォルトの書式はdateユーティリティの 出力と同じである。 strftimeが受け付ける変換指定については セクション Functions for Dealing with Time Stampsを参照 を参照のこと。

awkの組み込み関数については セクション 組み込み関数を参照. で詳述されている。

String Constants

awkでの文字列はダブルクォート(二重引用符、")で囲まれた キャラクタの並びである。文字列中にはCと同じようなエスケーブシーケンス を含めることができる。エスケープシーケンスには以下に挙げるものがある。

\\
バックスラッシュそのもの
\a
"警告"キャラクタ。通常はASCIIのベルキャラクタ。
\b
バックスペース
\f
フォームフィード(改ページ)
\n
改行
\r
復帰(キャリッジリターン)
\t
水平タブ
\v
垂直タブ
\xhex digits
`\x'に続く十六進数字の文字列で表わされるキャラクタ。 ANSI Cと同様に、=xに続く連続した十六進数字はエスケープシーケンスの 一部としてみなされる。"\x1B"はASCIIのESC(エスケープ)キャラクタからなる 文字列である。 (`\x'エスケープシーケンスはPOSIXのawkでは許されていない)。
\ddd
一桁から三桁までの八進数字の並びによって表わされるキャラクタ。 したがって、"\033"もASCIIのエスケープキャラクタからなる文字列である。
\c
cがこれまでに挙げたものでなかった場合、cという キャラクタそのもの。

エスケープシーケンスは正規表現定数の中でも使うことができる (たとえば/[ \t\f\n\r\v]/という正規表現は 空白キャラクタにマッチする)。

セクション エスケープシーケンスを参照.

ユーザー定義関数

awkでは関数は次のように定義する。

function name(parameter list) { statements }

関数呼び出し時の実引数は、関数の宣言での仮引数の実体として使われる。配列は 参照渡し、その他の変数は値渡しで引数が渡される。

もし、関数呼び出し時の引数が宣言されている引数の数よりも少なければ、足りな い引数は空文字列で関数に与えられる。そういった引数はローカル変数として扱え る。

関数呼び出しの開き括弧は空白などを置かずに、関数名に続いて書かれなければな らない。これは文法的に連接演算子があるとみなされてしまうのを防ぐためだ。

funcfunctionの代わりに使う事ができる(ただし、 POSIXの awkでは使えない)。

関数から値を返すためにreturn文を使う。

セクション ユーザー定義関数を参照.

歴史的な機能

gawkでは、awkの歴史的な機能を二つサポートしている。

第一に、組み込み関数lengthの呼び出し時に引数を渡さなかったり、 さらに括弧も省略できる!

a = length

これは次のように書いたのと同じことである。

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

そのため、以下のようなことになる。

$ echo abcdef | awk '{ print length }'
-| 6

この機能はPOSIXの標準では好ましくないものとされており、gawk`--lint'オプションが指定されているときにこれを見つけると警告を発す る(このようなlengthの使用法は、UNIX上のオリジナルのawk処理系が そのような使い方を許してしまったことにある。$0をデフォルトの引数 としてとるようなすべての組込み関数は括弧なしで関数を呼び出すことができた。 特に一般的だったのはlength関数をこのようなスタイルで使うことであ り、このような使用法がawkのマニュアルページに記載されていたのであ る)。

もう一つはbreak文やcontinue文をwhilefordo を使ったループではないところで使ったときのものである。伝統的な awkの処理系では、それはnext文を使ったのと同じように扱われ る。より新しい、Unix上のawkではこれは許されない。gawk では、`--traditional' オプションが指定されたときにこの機能をサポー トする。

`--posix' オプションと `--lint' オプションについての 詳細は セクション コマンドラインオプションを参照.


移動先 先頭, , , 末尾 セクション, 目次.