Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2022年7月27日
 
 

awk(1)

名前

nawk, awk - パターン走査およびパターン処理の言語

形式

/usr/bin/awk [-F ERE] [-v assignment] 'program' | -f progfile... [argument]...
/usr/xpg4/bin/awk [-F ERE] [-v assignment]... 'program' | -f progfile... [argument]...

説明

/usr/bin/awk/usr/xpg4/bin/awk の両ユーティリティーは、テキストデータ処理専用の awk プログラミング言語で記述されたプログラムを実行します。awk プログラムは、一連のパターンとそれに対応するアクション (動作) から構成されます。program を指定する文字列は、シェルによって解釈されないように単一引用符 (') で囲む必要があります。一連のパターン - アクション文は、program としてコマンド行に指定することも、-f progfile オプションで指定する 1 つ以上のファイル内に指定することもできます。パターンに一致する入力が読み取られると、そのパターンに関連付けられたアクションが実行されます。

入力は一連のレコードとして解釈されます。1 レコードはデフォルトで 1 行ですが、RS 組み込み変数を使用すれば変更できます。入力の各レコードは、program 内の各パターンと照合されます。パターンが一致するごとに、関連付けられたアクションが実行されます。

awk ユーティリティーは、各入力レコードを一連のフィールドとして解釈します。デフォルトでは、フィールドは空白以外の文字列です。デフォルトのスペースフィールド区切り文字 (スペースまたはタブ、あるいはその両方) は、FS 組み込み変数または –F ERE オプションを使って変更できます。awk ユーティリティーは、レコードの最初のフィールドを $1、2 番目のフィールドを $2、(以下同様) と見なします。記号 $0 はレコード全体を指します。その他のフィールドを設定すると、$0 が再評価されます。$0 を割り当てると、すべてのフィールドと NF 組み込み変数の値がリセットされます。

オプション

サポートしているオプションは、次のとおりです。

–F ERE

入力が読み取られる前に、入力フィールド区切り文字が拡張正規表現 ERE であることを定義します (文字も可)。

–f progfile

awk プログラムが含まれているファイル progfile のパス名を指定します。If multiple instances of this option are specified, the concatenation of the files specified as progfile in the order specified is the awk program.awk プログラムは、1 つの引数としてコマンド行に指定することもできます。

–v assignment

assignment 引数は、assignment オペランドと同じ形式にする必要があります。代入の形式は var=value です。var は後述する変数の 1 つです。指定された代入は、BEGIN パターンがあればそれに関連付けられたアクションも含め、awk プログラムの実行前に行われます。このオプションは複数回指定できます。

オペランド

次のオペランドがサポートされています。

program

–f オプションを省略すると、awk の最初のオペランドは awk プログラムのテキストになります。The application supplies the program operand as a single argument to awk.If the text does not end in a newline character, awk interprets the text as if it did.

argument

次の 2 つのタイプの argument は混在可能です。

file

読み取られる入力が含まれているファイルのパス名。プログラム内の一連のパターンと照合されます。file オペランドを 1 つも指定しない場合、または file オペランドに - を指定した場合には、標準入力が用いられます。

assignment

下線または移植性のある文字セットの英字で始まり、そのあとに下線、移植性のある文字セットの数字と英字、= 記号が続くオペランドは、パス名ではなく変数の代入を指定するものです。= 記号より前の文字は awk 変数の名前を表します。この名前が awk の予約語である場合、動作は未定義です。The characters following the equal sign is interpreted as if they appeared in the awk program preceded and followed by a double-quote (") character, as a STRING token, except that if the last character is an unescaped backslash, it is interpreted as a literal backslash rather than as the first character of the sequence \..変数には、この STRING トークンの値が代入されます。If the value is considered a numeric string, the variable is assigned its numeric value.このような変数代入は、そのあとに file 指定があればその処理の直前に実行されます。そのため、最初の file 引数より前の代入は、BEGIN アクション (ある場合) のあとに実行され、最後の file 引数よりあとの代入は END アクション (ある場合) の前に実行されます。file 引数がない場合は、標準入力の処理の前に代入が実行されます。

INPUT FILES

awk プログラムへの入力ファイルとして、次のソースからのものがあります。

  • file オペランドまたはそれと同等のもの (awk 変数 ARGVARGC を変更して得られる)

  • 標準入力 (file オペランドがない場合)

  • getline 関数の引数

これらはテキストファイルである必要があります。これらのファイルについて、変数 RS が復帰改行文字以外の値に設定されるかどうかによって、システムでは指定された区切り文字で終わるレコードを {LINE_MAX} バイトまでサポートしたり、もっと長いレコードをサポートすることができます。

f progfile を指定する場合、progfile オプション引数のそれぞれが示すファイルは、awk プログラムが含まれているテキストファイルである必要があります。

標準入力が使用されるのは、file オペランドが指定されない場合、または - の場合だけです。

詳細説明

awk プログラムは、次の形式のパターンとアクションのペアから構成されます。

pattern { action }

パターンまたはアクション (中括弧を含む) のどちらかを省略することもできます。パターン - アクション文は、セミコロンまたは復帰改行文字で区切られます。

パターンを省略すると、入力のどのレコードとも一致します。アクションを省略すると、入力内の一致するレコードが標準出力に書き込まれます。

awk プログラムの実行は、まずすべての BEGIN パターンに関連付けられたアクションをプログラム内の順序で実行することによって開始されます。次に、レコード区切り文字 (デフォルトでは復帰改行文字) が検出されるまで、各 file オペランド (ファイルを指定しない場合は標準入力) が処理され、ファイルからデータが読み取られ、現在の FS 値を使用して現在のレコードがフィールドに分割され、プログラム内の順序で各パターンが評価され、現在のレコードに一致する各パターンに関連付けられたアクションが実行されます。後続のパターンが評価される前に、一致するパターンのアクションが実行されます。最後に、すべての END パターンに関連付けられたアクションがプログラム内の順序で実行されます。

Expressions in awk

式は、パターンとアクションで使用される計算を記述します。次の表では、有効な式演算をグループごとに、優先度の高い順に並べてあります。優先度が同じ演算子は上下の横線で囲まれています。構文があいまいな式は、優先度の高い演算子が優先度の低い演算子よりも先に評価されます。In this table expr, expr1, expr2, and expr3 represent any expression, while lvalue represents any entity that can be assigned to (that is, on the left side of an assignment operator).

Syntax
Name
結果の型
結合規則
( expr )
グループ
expr の型
該当せず
$expr
フィールド参照
string
該当せず
++ lvalue
Pre-increment
数値
該当せず
-- lvalue
Pre-decrement
数値
該当せず
lvalue ++
後置インクリメント
数値
該当せず
lvalue --
後置デクリメント
数値
該当せず
expr ^ expr
べき乗
数値
! expr
論理否定
数値
該当せず
+ expr
単項プラス
数値
該当せず
- expr
単項マイナス
数値
該当せず
expr * expr
乗算
数値
expr / expr
除算
数値
expr % expr
剰余演算
数値
expr + expr
加算
数値
expr - expr
減算
数値
expr expr
文字列連結
string
expr < expr
より小さい
数値
なし
expr <= expr
小さいか等しい
数値
なし
expr != expr
等しくない
数値
なし
expr == expr
Equal to
数値
なし
expr > expr
Greater than
数値
なし
expr >= expr
大きいか等しい
数値
なし
expr ~ expr
ERE 一致
数値
なし
expr !~ expr
ERE non-match
数値
なし
expr in array
Array membership
数値
( index ) in
多次元配列
数値
array
membership
expr && expr
Logical AND
数値
expr | | expr
Logical OR
数値
expr1 ? expr2
条件式
選ばれた式の型
: expr3
expr2 または expr3
lvalue ^= expr
べき乗
数値
代入
lvalue %= expr
剰余演算代入
数値
lvalue *= expr
Multiplication assignment
数値
lvalue /= expr
Division assignment
数値
lvalue += expr
加算代入
数値
lvalue -= expr
減算代入
数値
lvalue = expr
代入
expr の型

各式には、1 つの文字列値、数値、またはその両方が入ります。すでに述べた特殊なコンテキストを除き、式の値は、その式が使われるコンテキストに必要な型に暗黙のうちに変換されます。文字列値は、次の呼び出しと同等のものによって数値に変換されます。

setlocale(LC_NUMERIC, "");
numeric_value = atof(string_value);

数値 (正確には整数値) は、文字列 %dfmt 引数として使用され、変換される数値が最初で唯一の expr 引数として使用される sprintf 関数の呼び出しと同等のものによって文字列に変換されます。その他の数値は、変数 CONVFMT の値が fmt 引数として使用され、変換される数値が最初で唯一の expr 引数として使用される sprintf 関数の呼び出しと同等のものによって文字列に変換されます。

次の場合、文字列値は数値列と見なされます。

  1. 先行および末尾の空白文字が無視されます。

  2. 無視されない最初の文字が + または - の場合、それは無視されます。

  3. 無視されない残りの文字が構文上 NUMBER トークンとして認識される場合、文字列は数値列と見なされます。

前述の手順で - 文字が無視されると、数値列の値は、認識された NUMBER トークンの数値の正負を逆にした値になります。それ以外の場合、数値列の数値は認識された NUMBER トークンの数値になります。文字列が数値列かどうかが問題になるのは、このセクションでその用語が使用されているコンテキストにおいてのみです。

ブール型のコンテキストで式が使用されるとき、式に数値が含まれている場合、値ゼロは偽として扱われ、その他の値は真として扱われます。それ以外の場合、NULL 文字列の文字列値は偽として扱われ、その他の値は真として扱われます。ブール型のコンテキストは、次のいずれかです。

  • 条件式の最初の部分式。

  • 論理否定、論理積、または論理和によって演算される式。

  • for 文の 2 番目の式。

  • if 文の式。

  • while 文または do . . . while 文の while 句の式。

  • パターンとして使用される式 (Overall Program Structure 内のように)。

awk 言語は、数字や文字列を格納するための配列を提供します。配列を宣言する必要はありません。配列は最初は空で、サイズは動的に変わります。連想配列機能の一種を提供する添字 (要素識別子) は文字列です。配列名とそれに続く角括弧内の添字は、構文で説明しているように、lvalue や式として使用できます。添字のない配列名を使用できるのは、次のコンテキストにおいてのみです。

  • 関数定義または関数呼び出し内のパラメータ。

  • キーワード in のあとに続く NAME トークン。

有効な配列インデックスは、一部のプログラミング言語で多次元配列にインデックスが付けられるのと同様に、コンマで区切られた 1 つ以上の式から構成されます。awk 配列は実際には 1 次元なので、SUBSEP 変数の値で区切られている個々の式の文字列値を連結することで、そのようなコンマで区切られたリストが 1 つの文字列に変換されます。

したがって、次の 2 つのインデックス処理は等しい結果となります。

var[expr1, expr2, ... exprn]
var[expr1 SUBSEP expr2 SUBSEP ... SUBSEP exprn]

in 演算子が付いた多次元インデックスは、括弧で囲む必要があります。in 演算子は、特定の配列要素の有無を調べ、無い場合には要素を作成しません。存在しない配列要素へのその他の参照を行うと、要素は自動的に作成されます。

変数と特殊変数

awk プログラムでは、変数を参照することで変数を使用できます。関数パラメータ以外は、明示的に宣言されません。初期化されていないスカラー変数と配列要素には、ゼロの数値と空の文字列の文字列値の両方が入っています。

フィールド変数は、$ とそれに続く数字または数値式によって指定されます。負でない整数以外のものに評価されるフィールド番号 expression の結果は不確定です。この状況では、初期化されていない変数や文字列値は数値に変換される必要がありません。新しいフィールド変数は、値を割り当てることによって作成されます。存在しないフィールド (つまり、$NF のあとのフィールド) を参照すると、NULL 文字列が生成されます。ただし、存在しないフィールドに割り当てると (たとえば、$(NF+2) = 5)、NF の値が増分され、値として NULL 文字列を持つ中間フィールドが作成され、$0 の値が再計算され、OFS の値でフィールドが区切られます。各フィールド変数には、作成時に文字列値が入ります。現在のロケールの小数点文字がピリオド文字に変更された文字列は数値列と見なされ (前述の「awk 内の式」を参照)、フィールド変数にも数値列の値が入ります。

/usr/bin/awk、/usr/xpg4/bin/awk

awk では次の特殊な変数を設定します。これらの変数は、/usr/bin/awk/usr/xpg4/bin/awk の両方でサポートされます。

ARGC

ARGV 配列内の要素の数。

ARGV

オプションと program 引数を除いたコマンド行引数の配列。ゼロから ARGC - 1 までの番号が付けられます。

ARGV 内の引数は変更や追加が可能です。ARGC は変更できます。各入力ファイルが終わると、awk は、現在の ARGC - 1 の値まで、ARGV の次の NULL 以外の要素を次の入力ファイルの名前として扱います。ARGV の要素を NULL に設定すると、入力ファイルとして扱われなくなります。名前 - は標準入力を示します。引数が assignment オペランドの形式と一致すると、その引数は file 引数ではなく代入として扱われます。

ENVIRON

変数 ENVIRON は環境値を表す配列です。配列のインデックスは環境変数の名前から成る文字列で、各配列要素の値はその変数の値から成る文字列です。環境変数の値が数値列と見なされる場合は、配列要素にもその数値が入ります。

In all cases where awk behavior is affected by environment variables (including the environment of any commands that awk executes via the system function or via pipeline redirections with the print statement, the printf statement, or the getline function), the environment used is the environment at the time awk began executing.

FILENAME

現在の入力ファイルのパス名。BEGIN アクション内では、この値は未定義です。END アクション内では、この値は最後に処理された入力ファイルの名前です。

FNR

現在のファイル内の現在のレコードの序数。BEGIN アクション内では、この値はゼロです。END アクション内では、この値は最後に処理されたファイル内の最後に処理されたレコードの番号です。

FS

入力フィールド区切り文字の正規表現。デフォルトはスペース文字です。

NF

現在のレコード内のフィールドの数。BEGIN アクション内では、var 引数のない getline 関数がその前に実行されていないかぎり、NF の使用は未定義です。Inside an END action, NF retains the value it had for the last record read, unless a subsequent, redirected, getline function without a var argument is performed prior to entering the END action.

NR

入力の開始からの現在のレコードの序数。BEGIN アクション内では、この値はゼロです。END アクション内では、この値は最後に処理されたレコードの番号です。

OFMT

出力文 "%.6g" 内でデフォルトとして数字を文字列に変換するための printf 形式。OFMT の値が浮動小数点形式の仕様でない場合、変換の結果は不確定です。

OFS

print 文出力フィールド区切り文字。デフォルトはスペース文字です。

ORS

print 出力レコード区切り文字。デフォルトは復帰改行文字です。

LENGTH

match 関数によって照合される文字列の長さ。

RS

RS の文字列値の最初の文字は入力レコード区切り文字 (デフォルトは復帰改行文字) です。RS に複数の文字が含まれている場合、結果は不確定です。RS が NULL の場合、レコードは一連の 1 つ以上の空白行で区切られます。先頭または末尾に空白行があっても、入力の先頭または最後に空のレコードが生成されることはありません。また、FS の値に関係なく、フィールド区切り文字は常に復帰改行文字になります。

RSTART

match 関数によって照合される文字列の開始位置。1 から順に番号が付いています。これは常に match 関数の戻り値と同等です。

SUBSEP

多次元配列用の添字区切り文字列。デフォルト値は \034 です。

/usr/xpg4/bin/awk

次の変数は、/usr/xpg4/bin/awk でのみサポートされます。

CONVFMT

数字を文字列に変換するための printf 形式 (OFMT が使用される出力文を除く)。デフォルトは %.6g です。

正規表現

awk ユーティリティーでは /usr/bin/egrep と同じ正規表現記法が使用されます。詳細は、egrep(1) のマニュアルページを参照してください。

/usr/xpg4/bin/awk ユーティリティーでは拡張正規表現記法が使用されます (regex(7) を参照)。ただし、特殊文字をエスケープするための C 言語表記規則、つまり、\\\a\b\f\n\r\t\v と、次の表に指定された表記、を ERE 内で使用できます。これらのエスケープシーケンスは、括弧の内でも外でも認識されます。Records need not be separated by newline characters and string constants can contain newline characters, so even the \n sequence is valid in awk EREs.正規表現内にスラッシュ文字を使用する場合は、次の表に示すようにエスケープ処理を行う必要があります。

Escape Sequence
Description
意味
\"
バックスラッシュ引用符
引用符文字
\/
バックスラッシュスラッシュ
スラッシュ文字
\ddd
バックスラッシュ文字のあとに 1 から 3 桁の 8 進文字 (01234567) の最長シーケンスが続きます。すべての桁が 0 である (つまり、NULL 文字を表している) 場合、動作は未定義です。
1 から 3 桁の 8 進整数で文字がエンコードされます。複数バイト文字には、バイトごとに先行 \ を含む、複数の連結されたエスケープシーケンスが必要です。
\c
A backslash character followed by any character not described in this table or special characters (\\, \a, \b, \f, \n, \r, \t, \v).
Undefined

2 つの正規表現照合演算子 ~ および ! ~ のいずれかを使用して、正規表現を特定のフィールドまたは文字列と照合できます。これらの演算子は、オペランドの右側を正規表現として解釈し、オペランドの左側を文字列として解釈します。正規表現が文字列と一致すると、~ 式は値 1 に評価され、! ~ 式は値 0 に評価されます。正規表現が文字列と一致しないと、~ 式は値 0 に評価され、! ~ 式は値 1 に評価されます。右辺のオペランドが字句トークン ERE 以外の式であれば、前述のエスケープ規約も含め、式の文字列値は拡張正規表現として解釈されます。文字列リテラル (字句トークン STRING) の値を判断するときも、これと同じエスケープ規約が適用され、この状況で文字列リテラルが使用されるときにもう一度適用されます。

ERE トークンが、~ または ! ~ 演算子の右辺以外の状況で使用されている場合、または後述の組み込み関数の引数の 1 つとして使用されている場合、結果の式の値は次のものと等価になります。

$0 ~ /ere/

The ere argument to the gsub, match, sub functions, and the fs argument to the split function (see String Functions) is interpreted as extended regular expressions.これらの引数は ERE トークンまたは任意の式のどちらでもよく、~ または ! ~ 演算子の右辺と同じ方法で解釈されます。

–F ERE オプションを使うか、式を含んだ文字列を組み込み変数 FS に割り当てることで、フィールドの分割に拡張正規表現を使用できます。FS 変数のデフォルト値は 1 つのスペース文字です。FS の動作について次に説明します。

  1. FS が 1 つの文字の場合

    • FS がスペース文字であれば、先行および末尾のスペース文字をスキップします。フィールドは 1 つ以上のスペース文字で区切られます。

    • FS が空白以外の文字 c であれば、フィールドは個々の c によって区切られます。

  2. それ以外の場合、FS の文字列値は拡張正規表現と見なされます。拡張正規表現と一致するシーケンスの発生により、フィールドが区切られます。

gsubmatchsplit、および sub 組み込み関数の場合を除き、正規表現照合は入力レコードに基づいて行われます。つまり、レコード区切り文字 (変数 RS の値の最初の文字、デフォルトは復帰改行文字) は式に組み込めず、レコード区切り文字と一致する式はありません。レコード区切り文字が復帰改行文字以外であれば、式に組み込まれた復帰改行文字を照合させることができます。この 4 つの組み込み関数では、正規表現照合がテキスト文字列に基づいて行われます。そのため、どの文字 (復帰改行文字やレコード区切り文字を含む) もパターンに組み込め、適切なパターンを任意の文字と照合させることができます。しかし、awk のすべての正規表現照合では、パターン、入力レコード、またはテキスト文字列に 1 つ以上の NULL 文字を使用すると、結果が未定義になります。

Patterns

A pattern is any valid expression, a range specified by two expressions separated by comma, or one of the two special patterns BEGIN or END.

Special Patterns

awk ユーティリティーでは、2 つの特殊パターン BEGINEND を認識します。各 BEGIN パターンは一度照合され、最初の入力レコードが読み取られる前 (以前の BEGIN アクションで getline 関数が使用された場合を除く) とコマンド行割り当てが行われる前に、関連付けられたアクションが実行されます。各 END パターンは一度照合され、最後の入力レコードが読み取られたあとに、関連付けられたアクションが実行されます。この 2 つのパターンにはアクションが関連付けられています。

BEGINEND は、他のパターンとは組み合わせられません。複数の BEGIN および END パターンを使用できます。BEGIN パターンに関連付けられたアクションは、プログラム内に指定された順序で実行されます。これは END アクションの場合も同じです。プログラム内では、END パターンが BEGIN パターンより前にあってもかまいません。

If an awk program consists of only actions with the pattern BEGIN, and the BEGIN action contains no getline function, awk exits without reading its input when the last statement in the last BEGIN action is executed.awk プログラムが END パターンのアクションだけ、または BEGIN および END パターンのアクションだけで構成されている場合、END アクションの文が実行される前に入力が読み取られます。

Expression Patterns

式パターンは、ブール型のコンテキストの式として評価されます。結果が真の場合、パターンは一致すると見なされ、関連付けられたアクションがあればそれが実行されます。結果が偽の場合、アクションは実行されません。

Pattern Ranges

パターンの範囲は、コンマで区切られた 2 つの式で構成されます。この場合、最初の式の一致から 2 番目の式の一致までの間にあるすべてのレコードに対してアクションが実行されます。この時点で、入力レコードの先頭から一致した範囲の最後まで、パターンの範囲を繰り返すことができます。

アクション

アクションは一連の文です。使用できる文は次のうちのいずれかです。

if ( expression ) statement [ else statement ]
while ( expression ) statement
do statement while ( expression )
for ( expression ; expression ; expression ) statement
for ( var in array ) statement
delete array[subscript] #delete an array element
break
continue
{ [ statement ] . . . }
expression        # commonly variable = expression
print [ expression-list ] [ >expression ]
printf format [ ,expression-list ] [ >expression ]
next              # skip remaining patterns on this input line
exit [expr] # skip the rest of the input; exit status is expr
return [expr]

1 つの文を、括弧で囲まれた文のリストに置き換えることができます。文は、復帰改行文字またはセミコロンで区切られ、指定された順序で実行されます。

next 文は、現在の入力レコードの以降の処理をすべて破棄します。BEGIN または END アクション内で next が現れたり、呼び出されたりすると、動作は未定義です。

exit 文は、すべての END アクションをプログラムソース内の順序で呼び出した後、以降の入力を読み取らずにプログラムを終了させます。END アクション内の exit 文は、以降の END アクションを実行せずにプログラムを終了させます。exit 文内に式が指定されている場合は、その数値が awk の終了ステータスになります。ただし、エラーが検出されたり、式を含んだ exit 文が実行される場合を除きます。

Output Statements

print 文も printf 文もデフォルトでは標準出力に書き込みます。次のように、output_redirection が指定されていれば、その宛先に出力が書き込まれます。

> expression >> expression | expression

In all cases, the expression is evaluated to produce a string that is used as a full pathname to write into (for > or >>) or as a command to be executed (for |).最初の 2 つの形式を使うと、その名前のファイルが現在開いていなければ開かれ、必要ならファイルが作成されます。最初の形式を使うと、ファイルは切り捨てられます。次に、出力がファイルに付加されます。ファイルが開いているかぎり、式が同じ文字列値に評価される以降の呼び出しは、単に出力をファイルに付加していきます。同じ文字列値に評価される式で close 関数が呼び出されるまで、ファイルは開いたままです。

3 番目の形式は、コマンドの入力にパイプされたストリームに出力を書き込みます。コマンド名として expression の値を持つストリームが現在開いていない場合は、ストリームが作成されます。作成されたストリームは、command 引数として expression の値、mode 引数として w の値を指定した popen(3C) 関数の呼び出しによって作成されるものと同等です。ストリームが開いているかぎり、expression が同じ文字列値に評価される以降の呼び出しは、出力を既存のストリームに書き込みます。同じ文字列値に評価される式で close 関数が呼び出されるまで、ストリームは開いたままです。close 関数が呼び出されると、pclose 関数が呼び出されたかのようにストリームが閉じます。

These output statements take a comma-separated list of expression s referred in the grammar by the non-terminal symbols expr_list, print_expr_list or print_expr_list_opt.This list is referred to here as the expression list, and each member is referred to as an expression argument.

print 文は、現在の出力フィールド区切り文字 (前述の変数 OFS を参照) で区切られ、出力レコード区切り文字 (前述の変数 ORS を参照) で終わる、指定された出力ストリームに各式引数の値を書き込みます。式引数はすべて文字列として扱われ、必要があれば変換されます。ただし、CONVFMT の値ではなく、OFMTprintf 形式が使用されます。空の式リストは、入力レコード全体 ($0) を意味します。

The printf statement produces output based on a notation similar to the File Format Notation used to describe file formats in this document Output is produced as specified with the first expression argument as the string format and subsequent expression arguments as the strings arg1 to argn, inclusive, with the following exceptions:

  1. format はグラフィック表現ではなく、実際の文字列です。そのため、空の文字位置を含めることはできません。format 文字列内のスペース文字は、変換仕様の flag 以外のコンテキストでは、通常の文字として扱われ、出力にコピーされます。

  2. 文字セットにデルタ文字が含まれていて、その文字が format 文字列に現れた場合は、通常の文字として扱われ、出力にコピーされます。

  3. バックスラッシュ文字で始まる escape sequences は、通常の文字のシーケンスとして扱われ、出力にコピーされます。なお、このようなシーケンスは、リテラル文字列に現れたときに awk によって字句が解析されますが、printf 文では特に処理されません。

  4. field width または precision は、数字列ではなく * 文字として指定できます。この場合、式リストの次の引数が取り出され、その数値がフィールド幅または精度と見なされます。

  5. システムでは、format 文字列で指定されていない空白文字を d または u 変換仕様の出力の先頭や末尾には付けません。

  6. システムでは、format 文字列で指定されていない先行ゼロを o 変換仕様の出力には付けません。

  7. c 変換仕様の場合、引数が数値であれば、エンコーディングとしてその値を持つ文字が出力されます。値がゼロの場合、または文字セットのどの文字にもエンコードされていない場合、動作は未定義です。引数が数値を持たない場合、文字列値の最初の文字が出力されます。文字列に文字が含まれていない場合、動作は未定義です。

  8. 引数が必要な変換仕様のそれぞれについて、次の式引数が評価されます。c 変換以外は、変換仕様に応じて値が適切な型に変換されます。

  9. format 文字列内のすべての変換仕様を満たすだけの十分な式引数がない場合、動作は未定義です。

  10. format 文字列内の文字シーケンスが % 文字で始まるが、有効な変換仕様を形成していない場合、動作は未定義です。

printprintf はどちらも、少なくとも {LINE_MAX} バイトを出力できます。

関数

awk 言語は、算術関数、文字列関数、入出力関数、一般関数など、さまざまな組み込み関数を備えています。

算術関数

int を除き、算術関数は ISO C 標準に基づいています。エラーが返される、または動作が未定義であると ISO C 標準で指定している場合、動作は未定義です。文法上は引数や括弧のない組み込み関数が認められていますが、次のリストで引数や括弧がオプション ([ ] 括弧で表示) と示されていないかぎり、省略した場合の結果は未定義です。

atan2(y,x)

y/x の逆正接を返します。

cos(x)

x をラジアン単位とし、x の余弦を返します。

sin(x)

x をラジアン単位とし、x の正弦を返します。

exp(x)

x の指数関数を返します。

log(x)

x の自然対数を返します。

sqrt(x)

x の平方根を返します。

int(x)

引数を切り捨てて、整数にします。It is truncated toward 0 when x > 0.

rand()

0 ≤ n < 1 の範囲の乱数 n を返します。

srand([expr])

rand のシード値を expr に設定します。expr が省略された場合は、時間を使用します。直前のシード値が返されます。

文字列関数

次のリストの文字列関数がサポートされています。文法上は引数や括弧のない組み込み関数が認められていますが、次のリストで引数や括弧がオプション ([ ] 括弧で表示) と示されていないかぎり、省略した場合の結果は未定義です。

gsub(ere,repl[, in])

後述の sub と同様の機能ですが、相違点は (ed ユーティリティーの一括置換のように) 指定されたときに、$0 または in 引数内に出現する正規表現をすべて置換することです。

index(s,t)

文字列 s の中で文字列 t が最初に出現する位置 (最初の文字を 1 として文字数を数えたもの) を返します。出現しない場合はゼロを返します。

length[([s])]

引数を文字列として解釈し、その長さ (文字数) を返します。引数が指定されていない場合は、レコード $0 全体の長さを返します。

match(s,ere)

文字列 s の中で拡張正規表現 ere が出現する位置 (最初の文字を 1 として文字数を数えたもの) を返します。出現しない場合はゼロを返します。RSTART は開始位置 (返される値と同じ) に設定され、一致しない場合はゼロに設定されます。RLENGTH は一致した文字列の長さに設定され、一致しない場合は -1 に設定されます。

split(s,a[, fs])

文字列 s を配列要素 a[1]、a[2]、...、 a[n] に分割し、値 n を返します。この分割は、拡張正規表現 fs によって行われ、fs が指定されていない場合はフィールドセパレータ FS によって行われます。各配列要素は、作成されたときに文字列値を持ちます。配列要素に割り当てられた文字列が、現在のロケールの小数点文字がピリオド文字に変更されていて、数値列と見なされる場合は、配列要素もその数値列の数値を持つことになります。fs の値が NULL 文字列の場合、結果は不確定です。

sprintf(fmt,expr,expr,...)

fmt で指定した printf 形式に従って式を書式設定し、結果として得られた文字列を返します。

sub(ere,repl[, in])

文字列 in 内で最初に見つかった拡張正規表現 ERE のインスタンスを文字列 repl に置き換え、置換した数を返します。文字列 repl 内に出現するアンパサンド (&) は、正規表現に一致する in 内の文字列に置換されます。アンパサンドの前にバックスラッシュ (\) を付けると、リテラルのアンパサンド文字として解釈されます。バックスラッシュが連続で 2 つ現れると、単一のリテラルバックスラッシュ文字として解釈されます。そのほかに現れるバックスラッシュ (ほかの文字の前など) は、リテラルバックスラッシュ文字として処理されます。repl が文字列リテラルの場合、アンパサンド文字の処理は字句処理 (バックスラッシュによるエスケープシーケンスの字句処理など) のあとに発生します。in を指定し、それが lvalue 以外の場合、動作は未定義です。in を省略した場合、awk では代わりに現在のレコード ($0) が使用されます。

substr(s,m[, n])

Return the at most n-character substring of s that begins at position m, numbering from 1.n がない場合、部分文字列の長さは文字列 s の長さによって制限されます。

tolower(s)

文字列 s に基づいて文字列を返します。現在のロケールの LC_CTYPE カテゴリによって tolower マッピングを持つように指定されている s 内の各大文字が、そのマッピングで指定されている小文字に置換されます。s 内のほかの文字は変更されません。

toupper(s)

文字列 s に基づいて文字列を返します。現在のロケールの LC_CTYPE カテゴリによって toupper マッピングを持つように指定されている s 内の各小文字が、そのマッピングで指定されている大文字に置換されます。s 内のほかの文字は変更されません。

パラメータとして ERE を取る前述の関数はすべて、次に定義されているように、正規表現であるパターン値または文字列値の式を受け付けます。

入出力関数と一般関数

入出力関数と一般関数は次のとおりです。

close(expression)

print または printf 文で開かれたファイルまたはパイプ、あるいは同じ文字列値の expression を指定した getline 呼び出しで開かれたファイルまたはパイプを閉じます。正常に閉じられた場合、関数は 0 を返します。それ以外の場合は、ゼロ以外を返します。

expression|getline[var]

コマンドの出力からパイプされたストリームから、入力レコードを読み取ります。コマンド名として expression の値を持つストリームが現在開いていない場合は、ストリームが作成されます。作成されたストリームは、command 引数として expression の値、mode 引数として r の値を指定した popen 関数の呼び出しによって作成されるものと同等です。ストリームが開いているかぎり、expression が同じ文字列値に評価される以降の呼び出しは、ファイルから後続のレコードを読み取ります。同じ文字列値に評価される式で close 関数が呼び出されるまで、ストリームは開いたままです。close 関数が呼び出されると、pclose 関数が呼び出されたかのようにストリームが閉じます。var がない場合、$0 および NF が設定されます。それ以外の場合、var が設定されます。

| の左側 (getline を含む式の先頭まで) に括弧で囲まれていない演算子 (連結を含む) がある場合、getline 演算子の構造があいまいになる可能性があります。演算子 $ のコンテキストでは、|$ よりも優先度が低いかのように動作します。その他の演算子を評価した結果は不確定であるため、移植性のあるアプリケーションでは、このような表記をすべて正しく括弧で囲む必要があります。

getline

$0 に、現入力ファイルの次の入力レコードを設定します。この形式の getline では、NFNR、および FNR 変数を設定します。

getline var

変数 var に、現在の入力ファイルの次のレコードを設定します。この形式の getline では、FNR および NR 変数を設定します。

getline [var] < expression

指定されたファイルから次の入力レコードを読み取ります。expression が評価されて、フルパス名として使用される文字列が生成されます。その名前のファイルが現在開いていない場合は開きます。ストリームが開いているかぎり、expression が同じ文字列値に評価される以降の呼び出しは、ファイルから後続のレコードを読み取ります。同じ文字列値に評価される式で close 関数が呼び出されるまで、ファイルは開いたままです。var がない場合、$0 および NF が設定されます。それ以外の場合、var が設定されます。

< の右側 (getline を含む式の終わりまで) に括弧で囲まれていない 2 項演算子 (連結を含む) がある場合、getline 演算子の構造があいまいになる可能性があります。このような構造を評価した結果は不確定であるため、移植性のあるアプリケーションでは、このような表記をすべて正しく括弧で囲む必要があります。

system(expression)

expression で指定されたコマンドを、system(3C) 関数と同等の方法で実行し、コマンドの終了ステータスを返します。

getline 関数はどの形式でも、正常終了時には 1、ファイルの終わりに達すると 0、エラーが発生時には -1 を返します。

ファイルやパイプラインの名前として文字列が使用されている場所では、文字列のテキストをまったく同じにする必要があります。The terminology “same string value” implies that “equivalent strings”, even those that differ only by space characters, represent different files.

User-defined Functions

awk 言語ではユーザー定義関数も使用できます。ユーザー定義関数は次のように定義できます。

function name(args, . . .) { statements }

関数は、awk プログラム内のどこからでも参照でき、特に、その定義より前に使用できます。関数の有効範囲はグローバルです。

関数の引数は、スカラーまたは配列のどちらでもかまいません。スカラーを使用する関数に引数として配列名が渡された場合、または配列を使用する関数に引数としてスカラー式が渡された場合、その動作は未定義です。関数の引数は、スカラーの場合は値によって、配列名の場合は参照によって渡されます。引数名は関数に対してローカルであり、その他のすべての変数名はグローバルです。引数名と関数名または特殊な awk 変数名に同じ名前は使用されません。グローバルな有効範囲を持つ変数名と関数名に同じ名前を使用しないでください。同じ有効範囲内では、スカラー変数と配列に同じ名前を使用しないでください。

関数定義内のパラメータの数は、関数呼び出しのときのパラメータの数と一致する必要はありません。ローカル変数として、余分な仮パラメータを使用できます。関数定義内の引数よりも少ない引数が関数呼び出しの際に指定された場合、関数本体でスカラーとして使用されている余分なパラメータは、NULL 文字列の文字列値とゼロの数値で初期化されます。また、関数本体で配列として使用されている余分なパラメータは、空の配列として初期化されます。関数定義内の引数よりも多い引数が関数呼び出しの際に指定された場合、その動作は未定義です。

関数の呼び出し時に、関数名と左括弧の間にスペースを入れることはできません。関数呼び出しは入れ子にすることができ、再帰呼び出しも可能です。入れ子または再帰関数呼び出しから戻っても、参照によって渡された配列パラメータ以外、呼び出し側関数のパラメータのどの値も変わりません。return 文を使用すれば、値を返すことができます。return 文が関数定義の外で使用された場合、その動作は未定義です。

関数定義において、左括弧より前と右括弧よりあとの復帰改行文字は任意指定です。関数定義は、パターンとアクションのペアが許可されている場所であればプログラム内のどこに置いてもかまいません。

使用法

indexlengthmatch、および substr 関数と ISO C 標準の同様の関数とを混同しないようにしてください。awk バージョンでは文字を扱い、ISO C 標準ではバイトを扱います。

連結演算は、明示的な演算子ではなく隣接する式によって表現されるので、評価の正しい優先度を適用するため、括弧を使う必要があることがよくあります。

sh を使用するアプリケーションの場合、コマンド行に指定する awk プログラムは、単一引用符で囲んで指定する (たとえば、'program') のがもっとも簡単な方法です。awk プログラムには一般に、二重引用符をはじめとする、シェルに対して特殊な意味を持つ文字が含まれていることが多いためです。awk プログラムに単一引用符文字が含まれている場合、プログラムの大部分を単一引用符で囲んで文字列として指定し、引用符付きの単一引用符文字とシェルによって連結するのが通常もっとも簡単な方法です。例:

awk '/'\''/ { print "quote:", $0 }'

これは、標準入力から読み取った単一引用符文字を含むすべての行に quote: という接頭辞を付けて出力します。

簡単な awk プログラムの例を次に示します。

使用例 1 第 3 フィールドの値が 5 より大きい入力行をすべて標準出力に書き出します。
$3 > 5
使用例 2 10 行ごとに書き出します。
(NR % 10) == 0
使用例 3 部分文字列が正規表現と一致する行を書き出します。
/(G|D)(2[0-9][[:alpha:]]*)/
使用例 4 部分文字列として、文字 G または D のあとに一連の数字と文字を伴う行を出力します。

この例では、文字クラス digitalpha を使って、言語に依存しない数字と英字をそれぞれ照合します。

/(G|D)([[:digit:][:alpha:]]*)/
使用例 5 第 2 フィールドは正規表現と一致するが第 4 フィールドは一致しない、という行を出力します。
$2 ~ /xyz/ && $4 !~ /xyz/
使用例 6 第 2 フィールドにバックスラッシュが含まれている行を出力します。
$2 ~ /\\/
使用例 7 第 2 フィールドにバックスラッシュが含まれている行を出力します (別の方法)。

ここではバックスラッシュによるエスケープを 2 度解釈しています。1 度は文字列の字句処理時、もう 1 度は正規表現の処理時です。

$2 ~ "\\\\"
使用例 8 各行の最後から 2 番目のフィールドと最後のフィールドをコロンで区切って出力します。
{OFS=":";print $(NF-1), $NF}
使用例 9 各行の行番号とフィールドの数を出力します。

行番号、コロン、フィールド数を表す 3 つの文字列が連結され、1 つの文字列として標準出力に書き込まれます。

{print NR ":" NF}
使用例 10 長さが 72 文字を超えている行を出力します。
length($0) > 72 {print}
使用例 11 最初の 2 つのフィールドを逆の順序で、OFS で区切って出力します。
{ print $2, $1 }
使用例 12 前述と同様ですが、入力フィールドはコンマ、またはスペース文字とタブ文字、あるいはその両方で区切られています。
BEGIN { FS = ",[\t]*|[\t]+" }
{ print $2, $1 }
使用例 13 先頭のカラムの値を合計し、その合計値と平均値を出力します。
{s += $1 }
END {print "sum is ", s, " average is", s/NR}
使用例 14 フィールドの内容を逆の順序で、1 行につき 1 フィールドずつ出力します。1 入力行につき多数の出力行が発生します。
{ for (i = NF; i > 0; --i) print $i }
使用例 15 「start」と「stop」という 2 つの文字列の間にあるすべての行を出力します。
/start/, /stop/
使用例 16 先頭フィールドの値が直前の行の先頭フィールドと異なっている行をすべて出力します。
$1 != prev { print; prev = $1 }
使用例 17 echo コマンドの動作をシミュレートします。
BEGIN  {
       for (i = 1; i < ARGC; ++i)
             printf "%s%s", ARGV[i], i==ARGC-1?"\n":""
       }
使用例 18 PATH 環境変数に含まれているパス接頭辞を 1 行につき 1 つずつ出力します。
BEGIN  {
       n = split (ENVIRON["PATH"], path, ":")
       for (i = 1; i <= n; ++i)
              print path[i]
       } 
使用例 19 「input」ファイルの内容を、ページ番号 5 を開始ページとして出力します。

input という名前のファイルがあり、次の形式のページヘッダーが含まれているとします。

Page#

また、program という名前のファイルの内容は次のとおりとします。

/Page/{ $2 = n++; }
{ print }

ここで、次に示すコマンドを実行します。

awk -f program n=5 input

これにより、input ファイルが、ページ番号 5 を開始ページとして出力されます。

環境変数

実行に影響を与える次の環境変数についての詳細は、environ(7) を参照してください。LC_COLLATE、LC_CTYPE、LC_MESSAGES、および NLSPATH。

LC_NUMERIC

数値入力の解釈、数値と文字列との変換、数値出力のフォーマットに用いる、小数点文字を決定します。awk プログラム (コマンド行引数で指定される代入も含む) の処理で認識される小数点文字は、ロケールに関係なくピリオド (POSIX ロケールの小数点文字) です。

終了ステータス

次の終了ステータスが返されます。

0

指定されたファイルはすべて正常に処理されました。

> 0

エラーが発生しました。

プログラム内で exit 式を使って終了ステータスを変更することができます。

属性

属性についての詳細は、マニュアルページの attributes(7) を参照してください。

/usr/bin/awk

属性タイプ
属性値
使用条件
system/core-os

/usr/xpg4/bin/awk

属性タイプ
属性値
使用条件
system/xopen/xcu4

関連項目

awk(1), ed(1), egrep(1), grep(1), lex(1), sed(1), popen(3C), printf(3C), system(3C), XPG4(7), attributes(7), environ(7), regex(7)

Aho, A. V.、B. W. Kernighan、P. J. Weinberger 共著、『The AWK Programming Language』、Addison-Wesley 発行、1988 年。

診断

file オペランドが指定され、指定されたファイルにアクセスできない場合、awk は標準エラーに診断メッセージを書き込んだあと、それ以上何もせずに終了します。

program オペランドまたは progfile オペランドで指定されたプログラムが有効な awk プログラム (「拡張機能説明」で指定されている) でない場合、その動作は未定義です。

入力行にスペースが含まれる場合、出力時に保証されません。

数値と文字の間の明示的な変換は行われません。式が数値として扱われるようにするには、式に 0 を加算します。式が文字列として扱われるようにするには、式に NULL 文字列 ("") を連結します。