awk コマンド
目的
ファイルでパターンに一致する行を検出し、検出された行に対して指定されたアクションを 実行します。
構文
awk [ -u ] [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...
説明
awk コマンドは、ユーザー指定の一連の命令を使用し、ユーザー指定の拡張正規表現に照らして、一度に 1 行ずつ一組のファイルを比較します。 次に、この拡張正規表現と一致する行に対してアクションが実行されます。
awk コマンドによるパターン検索は、grep コマンドの場合より汎用性があり、ユーザーは入力テキスト行に対して複数のアクションを実行できます。 awk コマンド・プログラミング言語はコンパイルの必要がないので、変数、数字関数、文字列関数、および論理演算子を使用できます。
awk コマンドは、LANG、LC_ALL、 LC_COLLATE、LC_CTYPE、LC_MESSAGES、 LC_NUMERIC、NLSPATH、および PATH 環境変数から影響を受けます。
この項目では、次のトピックについて説明します。
awk コマンドの入力
awk コマンドは、入力テキスト・ファイルとプログラム命令の 2 種類の入力を受け入れます。
入力テキスト・ファイル
検索とアクションは入力テキスト・ファイルに対して実行されます。 ファイルは次のようにして指定されます。
- コマンド・ラインで File 変数を指定する。
- 特殊変数 ARGV と ARGC を変更する。
- File 変数がない場合には標準入力を与える。
File 変数に複数のファイルが指定されている場合は、指定されている順にそれらのファイルが処理されます。
プログラム命令
ユーザーが指定した命令は、awk コマンドのアクションを制御します。 命令は、コマンド・ラインの `Program' 変数、または -f フラグと ProgramFile 変数で指定されたファイルの、どちらかから取り出されます。 複数のプログラム・ファイルが指定された場合には、指定された順にファイルが連結され、その結果としての命令の順番が使用されます。
awk コマンドの出力
awk コマンドは、入力テキスト・ファイル内のデータから、次の 3 種類の出力を作成します。
- 入力ファイルに変更を加えないで、選択したデータを標準出力に出力できます。
- 入力ファイルの一部を選択して変更できます。
- 入力ファイルの内容に変更を加えるかまたは変更を加えないで、選択したデータを変更して標準出力に出力できます。
これらの 3 種類の出力のすべてを、同一のファイルに対して実行できます。 awk コマンドが認識するプログラミング言語を使用して、ユーザーは出力をリダイレクトすることができます。
レコードとフィールドによるファイル処理
ファイルは次の方法で処理されます。
- awk は、指定された命令をスキャンし、入力ファイルを読み取る前に実行するように指定されたすべてのアクションを実行します。
awk プログラミング言語の BEGIN ステートメントで、最初のレコードの読み取り前に実行する一連の命令を指定できます。 これは、特殊変数を初期化するときに特に役立ちます。
- 1 つのレコードが入力ファイルから読み取られます。
レコードは、レコード分離文字で区切られたデータの集合です。 レコード分離文字のデフォルト値は改行文字であり、この改行文字によってファイ ルの各行が別々のレコードになります。 RS 特殊変数を設定することによって、レコード分離文字を変更することができます。
- レコードが、awk コマンドの命令で指定された各パターンと比較されます。
コマンド命令で、レコードの特定のフィールドを比較するよう指定することができます。 何も指定しないと、フィールドは空白 (ブランクまたはタブ) で区切られます。 各フィールドはフィールド変数によって参照されます。 レコードの最初のフィールドには $1 変数、2 番目のフィールドには $2 変数というように、変数が割り当てられます。 レコード全体には $0 変数が割り当てられます。 フィールド分離文字は、コマンド行で -F (R) フラグを使用するか、 ファイル・システム 特殊変数を設定することによって変更できます。 ファイル・システム 特殊変数は、ブランク、単一文字、または 拡張正規表現の値に設定できます。
- レコードがあるパターンと一致した場合には、そのパターンに関連付けられたアクションがレコードに対して実行されます。
- レコードが各パターンと比較され、指定されたすべてのアクションが実行された後で、次のレコードが入力から読み取られます。この処理は、すべてのレコードが入力ファイルから読み取られるまで繰り返されます。
- 複数の入力ファイルが指定された場合には、次のファイルがオープンされます。そして、すべての入力ファイルが読み取られるまで、これが繰り返されます。
- 最後のファイルの最後のレコードが読み取られた後で、awk コマンドは、入力処理後に実行するように指定された命令を実行します。
awk プログラミング言語の END ステートメントで、最後のレコードを読み取った後で実行するアクションを指定できます。 これは、awk コマンドにより実行された処理を示すメッセージを送信するために、特に役立ちます。
awk コマンド・プログラミング言語
awk コマンドのプログラミング言語は、次のフォーマットのステートメントで構成されています。
パターン { Action }
レコードが指定された Pattern (パターン) と一致するか、またはそのパターンと一致するフィールドを持っている場合には、関連付けられた Action (アクション) が実行されます。 アクションなしでパターンを指定することができます。その場合、そのパターンが入った行全体が標準出力に書き出されます。 パターンなしで指定されたアクションは、すべての入力レコードに対して実行されます。
パターン
awk コマンド言語構文に使用されるパターンは次の 4 種類です。
正規表現
awk コマンドが使用する拡張正規表現は grep コマンドまたは egrep コマンドが使用する拡張正規表現と似ています。 拡張正規表現の最も単純なフォーマットは、スラッシュで囲まれた文字の文字列です。 例えば、次の名前のファイルがあるとします。testfile内容は以下のとおりです。
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
ここで、次のコマンド・ラインを入力するとします。
awk '/smi/' testfile
ストリングのオカレンスを含むすべてのレコードを標準出力に出力します。smiこの例では、以下のプログラムは、'/smi/'アーク コマンドは、アクションのないパターンです。 出力は以下のようになります。
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
拡張正規表現は、次の特殊文字を使って形成します。
文字 | 機能 |
---|---|
+ | + (正符号) の前の文字または拡張正規表現の 1 個以上のオカレンスが文字列内にある場合、その文字列は一致することを指定します。 コマンド・ライン:
文字を含む文字列を含むすべてのレコードを標準出力に出力します。smit、その後に 1 つ以上のh文字を使用して終了します。ernこの例の出力は、次のようになります。
|
? | (疑問符) の前の文字または拡張正規表現のゼロ個または 1 個のオカレンスが文字列内にある場合、その文字列は一致することを指定します。 (疑問符) は文字列の中にあります。 コマンド・ライン:
文字を含むすべてのレコードを標準出力に出力します。smit,後に 0 個または 1 個のインスタンスが続きます。h文字。 この例の出力は次のようになります。
|
| | | (縦線) で区切られた文字列のどちらかが文字列内にある場合に、その文字列は一致することを指定します。 コマンド・ライン:
ストリングを含むすべてのレコードを標準出力に出力します。allenまたはalanこの例の出力は、次のようになります。
|
( ) | 文字列を正規表現でグループ化します。 コマンド・ライン:
次のストリングを持つすべてのレコードを標準出力に出力します。aeまたはalleまたはanneまたはallnneこの例の出力は、次のようになります。
|
{分} | パターンのちょうど m 個のオカレンスが文字列内にある場合、その文字列は一致することを指定します。 コマンド・ライン:
これは、標準出力に次のように出力します。
|
{m,} | パターンの少なくとも m 個のオカレンスが文字列内にある場合、その文字列は一致することを指定します。 コマンド・ライン:
これは、標準出力に次のように出力します。
|
{m、n} | パターンの m から n までのオカランスが文字列内にある場合 (ここで m <= n)、その文字列は一致することを指定します。 コマンド・ライン:
これは、標準出力に次のように出力します。
|
[ストリング] | 正規表現が、大括弧内の String 変数で指定された文字と一致することを意味します。 コマンド・ライン:
文字を含むすべてのレコードを標準出力に出力します。smその後に任意の文字がアルファベット順に続きます。aへhこの例の出力は、次のようになります。
|
[^ ストリング] | [ ] (大括弧) 内で指定された文字列の先頭にある ^ (脱字記号) は、正規表現が大括弧内のどの文字とも 一致しない ことを示します。 したがって、コマンド・ラインは次のようになります。
これは、標準出力に次のように出力します。
|
~,!~ | 指定された変数が正規表現に一致する (ティルド) か、または一致しない (感嘆符とティルド) かを示す条件ステートメントを表します。 コマンド・ライン:
最初のフィールドに文字が含まれているすべてのレコードを標準出力に出力します。n.この例の出力は次のようになります。
|
^ | フィールドまたはレコードの先頭を示します。 コマンド・ライン:
次の文字を持つすべてのレコードの標準出力に印刷します。h2 番目のフィールドの最初の文字として使用します。 この例の出力は次のようになります。
|
$ | フィールドまたはレコードの終わりを示します。 コマンド・ライン:
次の文字を持つすべてのレコードの標準出力に印刷します。y2 番目のフィールドの最後の文字として使用します。 この例の出力は次のようになります。
|
. (ピリオド) | スペースの終わりにある、端末の改行文字以外の任意の 1 文字を示します。 コマンド・ライン:
文字を含むすべてのレコードを標準出力に出力します。aおよび e が 2 文字で区切られています。 この例の出力は次のようになります。
|
*(アスタリスク) | ゼロ個または 1 個以上の任意の文字を示します。 コマンド・ライン:
文字を含むすべてのレコードを標準出力に出力します。aおよび e はゼロ個以上の文字で区切られます。 この例の出力は次のようになります。
|
¥ (円記号) | エスケープ文字。 拡張正規表現で特別な意味を持つ文字の前にエスケープ文字があると、その文字の特別な意味がなくなります。 例えば、次のコマンド・ラインの例を見てください。
は、パターン a // と一致します。理由は、正規表現の区切り文字としてのスラッシュの通常の意味が、円記号により否定されるからです。 円記号自体を文字として指定するには、円記号を 2 個続けて使用します。 円記号とその使用法の詳細については、このあとのエスケープ・シーケンスの説明を参照してください。 |
認識されるエスケープ・シーケンス
awk コマンドは、awk コマンド自体が特殊文字として使用する幾つかのエスケープ・シーケンスの他に、C 言語規則で使われるほとんどのエスケープ・シーケンスを認識します。 エスケープ・シーケンスは次のとおりです。
エスケープ・シーケンス | 表される文字 |
---|---|
\" | ¥" (二重引用符) |
\/ | / (スラッシュ) 文字 |
¥ddd | エンコードが 1 桁、2 桁、または 3 桁の 8 進整数で表される文字。d は各桁の 8 進数字を表します。 |
\\ | ¥ (円記号) |
\a | 警報文字 |
\b | バックスペース文字 |
\f | 用紙送り文字 |
\n | 改行文字 (次の注を参照) |
\r | 復帰文字 |
\t | タブ文字 |
\v | 垂直タブ |
注: gsub、match、split、および sub 組み込み関数の場合を除き、拡張正規表現の突き合わせは入力レコードに基づいて行われます。 レコード分離文字 (デフォルトでは改行文字) を拡張表現に組み込むことはできず、レコード分離文字に一致する表現はありません。 レコード分離文字が改行文字でない場合は、改行文字の突き合わせができます。 先に述べた 4 つの組み込み関数では、テキスト文字列に基づいて突き合わせが行われるので、任意の文字 (レコード分離文字を含む) をパターンに組み込んで、そのパターンを適切な文字と突き合わせることができます。 ただし、awk コマンドを使用して突き合わせるすべての正規表現では、パターンの中に 1 個以上の NULL 文字が使用されていた場合、結果は予測できません。
関係式
関係演算子 < (より小)、> (より大)、<= (より小か 等しい)、>= (より大か等しい)、= = (等しい)、および ! = (等しくない) を使用して、パターンを 形成できます。 例えば、次のパターンを見てください。
$1 < $4
これは、最初のフィールドが 4 番目のフィールドより小さいレコードに一致します。 関係演算子は文字列値と共に使うこともできます。 次に例を示します。
$1 =! "q"
最初のフィールドが次のフィールドではないすべてのレコードと一致します。qストリング値は、照合値で突き合わせることもできます。 次に例を示します。
$1 >= "d"
最初のフィールドが次の文字で始まるすべてのレコードに一致します。a,b,c、またはd他の情報が指定されていない場合、フィールド変数はストリング値として比較されます。
パターンの組み合わせ
次の 3 つのオプションを使用して、パターンを組み合わせることができます。
- 範囲は、, (コンマ) で区切られた 2 つのパターンによって指定されます。 アクションは、最初のパターンと一致するレコードで始まるすべてのレコードに対して実行され、2 番目のパターンと一致するレコードまで (このレコードを含む) 続きます。 次に例を示します。
ストリングを含むレコードに一致します。begin、およびそれとストリングを含むレコードとの間のすべてのレコードend(ストリングを含むレコードを含む)end./begin/,/end/
- 小括弧 ( ) は、パターンをまとめてグループ化します。
- ブール演算子 || (論理和)、&& (論理積)、および ! (論理否定) は、パターンを組み合わせて、真と評価する場合に一致し、それ以外の場合には一致しない式を形成します。 例えば、次のパターンを見てください。
最初のフィールドが以下のレコードと一致します。al2 番目のフィールドは123.$1 == "al" && $2 == "123"
BEGIN パターンと END パターン
BEGIN パターンで指定したアクションは、入力を読み取る前に実行されます。 END パターンで指定したアクションは、すべての入力を読み取った後で実行されます。 複数の BEGIN パターンと END パターンを指定でき、指定した順序で処理されます。 プログラムのステートメントの中では、END パターンを BEGIN パターンの前に置くことができます。 プログラムが BEGIN ステートメントだけで構成されている場合は、アクションは実行されますが、入力は読み取られません。 プログラムが END ステートメントだけで構成されている場合は、すべてのアクションに先立って入力が読み取られます。
アクション
アクション・ステートメントには、次のように幾つかの種類があります。
アクション・ステートメント
アクション・ステートメントは { } (中括弧) で囲みます。 アクション・ステートメントをパターンなしで指定すると、すべてのレコードに対してアクションが実行されます。 中括弧内に複数のアクションを指定できますが、改行文字または ; (セミコロン) で区切る必要があります。ステートメントは、指定された順に処理されます。 アクション・ステートメントには次のものがあります。
- 算術ステートメント
- 算術演算子 + (加算)、- (減算)、/ (除算)、^ (指数)、* (乗算)、% (モジュラス) が、次のフォーマットで使用されます。
Expression Operator Expression
したがって、次のステートメントのようになります。
$2 = $1 ^ 3
これは、最初のフィールドの値の 3 乗を 2 番目のフィールドに割り当てます。
- 単項ステートメント
- 単項 - (減算) および単項 + (加算) の働きは、次のように、C プログラミング言語の場合と同様です。
+Expression or -Expression
- 増分ステートメントと減分ステートメント
- 前置増分ステートメントと前置減分ステートメントの働きは、次のように、C プログラミング言語の場合と同様です。
++Variable or --Variable
後置増分ステートメントと後置減分ステートメントの働きは、次のように、C プログラミング言語の場合と同様です。
Variable++ or Variable--
- 代入ステートメント
- 代入演算子 += (加算)、-= (減算)、/= (除算)、および *= (乗算) は、C プログラミング言語の場合と同様の働きをします。フォーマットは次のとおりです。
Variable += Expression
Variable -= Expression
Variable /= Expression
Variable *= Expression
例えば、次のステートメントがあるとします。
$1 *= $2
これは、フィールド変数 $1 にフィールド変数 $2 を掛けて、新しい値を $1 に割り当てます。
代入演算子 ^= (指数) と %= (モジュラス) は、次のフォーマットになります。
Variable1^=Expression1
および
Variable2%=Expression2
これはそれぞれ、C プログラミング言語の次のステートメントと同じです。
Variable1=pow(Variable1, Expression1)
および
Variable2=fmod(Variable2, Expression2)
ここでpowポウ サブルーチンです。fmodFMOD サブルーチンです。
- 文字列連結ステートメント
- 文字列を並べて書くことにより、文字列値を連結することができます。 次に例を示します。
$3 = $1 $2
これは、フィールド変数 $1 と $2 内の文字列を連結したものを、フィールド変数 $3 に割り当てます。
組み込み関数
awk コマンド言語は、算術関数、文字列関数、および汎用関数を使用します。 ファイルに書き込んだ後でそのファイルを同じプログラムの中で読み取れるようにするには、close サブルーチン・ステートメントが必要です。
算術関数
次の算術関数は、同じ名前の C 言語のサブルーチンと同じアクションを実行します。
項目 | 説明 |
---|---|
atan2( Y, X ) | y/x の逆正接を戻します。 |
COS ( X ) | x の余弦を戻します。x の単位はラジアンです。 |
罪 ( X ) | x の正弦を戻します。x の単位はラジアンです。 |
exp ( X ) | x の指数関数を戻します。 |
ログ ( X ) | x の自然対数を戻します。 |
SQL ( X ) | x の平方根を戻します。 |
整数 ( X ) | x の値を切り捨てて整数にして戻します。 |
ランド ( ) | 乱数 n (0 <= n < 1) を返します。 |
srand( [Expr] ) | rand 関数のシード値を Expr パラメーターの値に設定します。Expr パラメーターを省略した場合は、時刻が使用されます。 直前のシード値が戻されます。 |
文字列関数
次のような文字列関数があります。
項目 | 説明 |
---|---|
gsub ( エーレ, 複製, [ イン ] ) | 正規表現のすべてのオカレンスを置換することを除いて、sub 関数とまったく同じ演算を実行します。 |
サブ ( エーレ, 複製, [ イン ] ) | In パラメーターで指定された文字列の中の Ere パラメーターで指定された拡張正規表現の最初のオカレンスを、Repl パラメーターで指定された文字列で置き換えます。 sub 関数は、置換の数を戻します。 Repl パラメーターによって指定されたストリングに含まれる & (アンパーサンド) は、In パラメーターのストリングに置換されます。このパラメーターは、Ere パラメーターによって指定された拡張正規表現に一致します。 In パラメーターを指定しなかった場合は、デフォルト値としてレコード全体 ($0 レコード変数) が置換されます。 |
索引 ( String1, String2 ) | String1 パラメーターで指定された文字列内部に String2 パラメーターで指定された文字列がある場合に、String1 文字列内での String2 文字列の (1 から数えた) 位置を戻します。 String2 パラメーターが String1 パラメーター内部にない場合は、0 が戻されます。 |
length [(String)] | String パラメーターで指定された文字列の長さ (文字数) を戻します。 String パラメーターを指定しなかった場合は、レコード全体の長さ ($0 レコード変数) が戻されます。 |
blength [(String)] | String パラメーターで指定された文字列の長さ (バイト数) を戻します。 String パラメーターを指定しなかった場合は、レコード全体の長さ ($0 レコード変数) が戻されます。 |
サブスター ( ストリング, 分, [ N ] ) | N パラメーターで指定された文字数を持つサブストリングを戻します。 サブストリングは、String パラメーターで指定された文字列から取られ、M パラメーターで指定された位置にある文字で始まっています。 M パラメーターは、String パラメーターの最初の文字と 1番目の文字で指定されます。 N パラメーターが指定されていない場合、サブストリングの長さは、M パラメーターで指定された位置から String パラメーターの終端までになります。 |
一致 ( ストリング, エーレ ) | Ere パラメーターで指定された拡張正規表現が String パラメーターで指定された文字列内部にあれば、その位置を、先頭文字を 1 とした場合の文字の番号で戻します。Ere パラメーターの値が文字列内にない場合は、0 を戻します。 RSTART 特殊変数は戻り値に設定されます。 RLENGTH 特殊変数は、一致文字列の長さに設定されるか、または、一致する文字列が見つからない場合は -1 (負の 1) に設定されます。 |
split( String, A, [Ere] ) | String パラメーターで指定されたストリングを配列エレメント A[1]、A[2]、. . .、A[n] に分割し、n 変数の値を戻します。 分割は、Ere パラメーターによって指定された拡張正規表現、または Ere パラメーターが指定されていない場合は現在のフィールド分離文字 (FS 特殊変数) を使用して行われます。 A 配列のエレメントは、特定のエレメントが数値も持つ必要があることがコンテキストにより指示されている場合を除き、文字列値で作成されます。 |
トローワー ( ストリング ) | String パラメーターで指定された文字列を、文字列内の大文字を小文字に変換して戻します。 大文字と小文字のマッピングは、現行ロケールの LC_CTYPE カテゴリーによって定義されています。 |
タッパー ( ストリング ) | String パラメーターで指定された文字列を、文字列内の小文字を大文字に変換して戻します。 大文字と小文字のマッピングは、現行ロケールの LC_CTYPE カテゴリーによって定義されています。 |
sprintf(Format, Expr, Expr, . . . ) | Expr パラメーターで指定された式を、Format パラメーターで指定された printf サブルーチン形式文字列に従ってフォーマット設定します。 |
一般機能
次のような汎用関数があります。
項目 | 説明 |
---|---|
閉じる ( 式 ) | print または printf ステートメント、または同じ文字列値の Expression パラメーターを使用した getline 関数の呼び出しによってオープンされたファイルまたはパイプをクローズします。 ファイルまたはパイプが正常にクローズされると、0 が戻されます。クローズに失敗すると、ゼロ以外の値が戻されます。 ファイルに書き込んだ後でそのファイルを同じプログラムの中で読み取るには、close ステートメントが必要です。 |
システム (コマンド ) | Command パラメーターで指定されたコマンドを実行して、その終了状況を戻します。 system サブルーチンと同じです。 |
式 | getline [ 変数 ] | Expression パラメーターで指定されたコマンドの出力からパイプを通して入力されたストリームから、入力レコードを 1 つ読み取って、Variable パラメーターで指定された変数にそのレコードの値を割り当てます。 Expression パラメーターの値と同じ名前のコマンドにより現在オープンされているストリームがない場合は、そのようなストリームが作成されます。 作成されたストリームは、Command パラメーターを使用した popen サブルーチンへの呼び出しによって作成されたものと同等で、Expression パラメーターおよび Mode パラメーター・セットの値を r の値として使用します。 getline 関数に対する後続の各呼び出しでは、ストリームのオープン状態が維持される限り別のレコードを読み取り、Expression パラメーターは同じストリングとしてみなされます。 Variable パラメーターを指定しなかった場合は、$0 レコード変数と NF 特殊変数の値は、ストリームから読み取られたレコードに設定されます。 |
getline [ Variable ] < Expression | Expression パラメーターで指定されたファイルから次の入力レコードを 1 つ読み取って、Variable パラメーターで指定された変数の値をそのレコードの値に設定します。 getline 関数に対する後続の各呼び出しでは、ストリームのオープン状態が維持される限り別のレコードを読み取り、Expression パラメーターは同じストリングとしてみなされます。 Variable パラメーターを指定しなかった場合は、$0 レコード変数と NF 特殊変数の値は、ストリームから読み取られたレコードに設定されます。 |
getline [ 変数 ] | Variable パラメーターで指定された変数の値を、現行の入力ファイルから取り出した次の入力レコードに設定します。 変数 パラメーターが指定されていない場合、 $0 レコード変数はレコードの値に設定され、 NF (フランス)、 NR (R)、および FNR (R) 特殊変数も設定されます。 |
注: どのフォーマットの getline 関数も、正常な入力の場合は 1 を戻し、ファイルの終わり (EOF) の場合は 0 を戻し、エラーの場合は -1 を戻します。
ユーザー定義の関数
ユーザー定義関数は、次のフォーマットで宣言します。
function Name (Parameter, Parameter,...) { Statements }
関数は、awk コマンド・プログラム内のどこからでも参照でき、関数定義の前でも使用できます。 関数の有効範囲はグローバルです。
関数パラメーターは、スカラーまたは配列のどちらかにできます。 パラメーター名だけは関数にとってローカルなものですが、その他のすべての変数名はグローバルです。 異なるエンティティーに同じ名前を使用することはできません。例えば、パラメーター名を、関数名または特殊変数として重複使用することはできません。 グローバルな有効範囲を持つ変数は、関数と同じ名前を共有することはできません。 スカラーと配列は、同じ有効範囲内で同じ名前を持つことはできません。
関数定義の中のパラメーターの数は、関数を呼び出すときに使用されるパラメーターの数と一致していなくてもかまいません。 余分な仮パラメーターはローカル変数として使用できます。 余分なスカラー・パラメーターは、空文字列と等価の文字列値および数値 0 を使用して初期化されます。余分な配列パラメーターは空配列として初期化されます。
関数を呼び出す場合、関数名と左括弧の間にはホワイト・スペースを入れません。 関数呼び出しはネストでき、再帰的です。 ネストされた関数呼び出しまたは再帰的関数呼び出しから戻ったとき、すべての呼び出し元関数のパラメーターの値は、参照により渡された配列パラメーターを除き、すべて元の状態のままでなければなりません。 return ステートメントを使用して値を戻すことができます。
関数定義内部では、改行文字は { (左中括弧) の前と、} (右中括弧) の後に、入れても入れなくてもかまいません。
関数定義の例を次に示します。
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
}
関数 average には配列が渡されます。g、変数、n配列内のエレメントの数を指定します。 次に、この関数は平均を取得し、その値を戻します。
条件ステートメント
awk コマンド・プログラミング言語のほとんどの条件ステートメントは、C プログラミング言語の条件ステートメントの構文および機能と同じです。 どの条件ステートメントでも、{ } (中括弧) を使ってステートメントをグループ化できます。 条件ステートメントの式の部分とステートメント部分の間には改行文字を入れても入れなくてもかまいません。また、{ } (中括弧) 内の複数のステートメントを区切るには、改行文字または ; (セミコロン) を使用します。 C 言語型の 6 つの条件ステートメントは次のとおりです。
項目 | 説明 |
---|---|
if | 構文は次のとおりです。 if ( 式 ) { ステートメント} [ else アクション ] |
while | 構文は次のとおりです。 while ( 式 ) { ステートメント } |
FOR | 構文は次のとおりです。 for ( Expression ; Expression ; Expression) { Statement } |
break | break ステートメントを while ステートメントまたは for ステートメント内で使用すると、プログラム・ループが終了します。 |
続く | continue ステートメントを while ステートメントまたは for ステートメント内で使用すると、プログラム・ループが次の反復に進みます。 |
awk コマンド・プログラミング言語には C 言語の規則に従わない、次の 5 つの条件ステートメントがあります。
項目 | 説明 |
---|---|
For...in | 構文は次のとおりです。 対象: ( 変数 内 配列 ) { ステートメント } for...in ステートメントは、Variable パラメーターを、一度に 1 索引ずつ順不同で Array 変数の各索引値に設定し、反復するたびに、Statement パラメーターで指定されたアクションを実行します。 for...in ステートメントの例については、delete ステートメントを参照してください。 |
以下の場合 | 構文は次のとおりです。 条件 ( 変数 内 配列 ) { ステートメント } if...in ステートメントは、Array エレメントが存在するかどうかを調べます。 Array エレメントが見つかると、ステートメントが実行されます。 |
削除 | 構文は次のとおりです。 削除 配列 [ 式 ] delete ステートメントは、Array パラメーターで指定された配列エレメントと Expression パラメーターで指定された索引の両方を削除します。 例えば、次のステートメントを見てください。
すべての要素が削除されます。g[]array. |
exit | 構文は次のとおりです。 exit [ 式 ] exit ステートメントは最初にすべての END アクションを発生順に呼び出し、Expression パラメーターによって指定された終了状況を使用して awk コマンドを終了します。 exit ステートメントが END アクション内部で発生すると、それ以上の END アクションは呼び出されません。 |
# | 構文は次のとおりです。 # コメント # ステートメントは注釈を入れます。 注釈は、必ず改行文字で終わらせる必要がありますが、行のどこからでも始めることができます。 |
次へ | 現行の入力レコードの処理を停止して、次の入力レコードに進みます。 |
出力ステートメント
awk コマンド・プログラミング言語の 2 つの出力ステートメントは次のとおりです。
項目 | 説明 |
---|---|
印刷 | 構文は次のとおりです。 print [ ExpressionList ] [ リダイレクト ] [ 式 ] print ステートメントは、ExpressionList パラメーターで指定された各式の値を、標準出力に書き出します。 各式は OFS 特殊変数の現行値によって分離され、各レコードは ORS 特殊変数の現行値によって終了します。 出力は、Redirection パラメーターを 使用してリダイレクトできます。このパラメーターでは、> (より大)、>> (二重の より大)、および | (パイプ) によって、3 つの出力リダイレクトが指定 できます。 Redirection パラメーターでは、出力をリダイレクトする方法を 指定し、Expression パラメーターは、ファイルへの パス名 (Redirection パラメーターが > または >> のとき) と コマンドの名前 (Redirection パラメーターが | のとき) のいずれかです。 |
printf | 構文は次のとおりです。 printf Format [, ExpressionList ] [ リダイレクト ] [ Expression ] printf ステートメントは、ExpressionList パラメーターで指定された式を、Format パラメーターで指定されたフォーマットで標準出力に書き出します。 printf ステートメントは、 printf コマンドとまったく同じように機能します。ただし、c変換指定 (%c)。 Redirection パラメーターおよび Expression パラメーターの機能は、print ステートメントの場合と同じです。 For thec変換指定: 引数に数値がある場合は、その値がエンコードされている文字が出力されます。 値が 0 であるか、または文字セットのどの文字のエンコードにも対応していない場合は、動作は不定です。 引数が数値でない場合は、文字列値の先頭文字が出力されます。文字列内に文字がまったく含まれていない場合の動作は不定です。 |
注: Expression パラメーターに Redirection パラメーター用のパス名を指定する場合は、Expression が必ず文字列として処理されるように、そのパラメーターを二重引用符で囲む必要があります。
変数
変数は、スカラー、フィールド変数、配列、または特殊変数のどれかです。 変数名の先頭に数字を使用することはできません。
変数は、変数を参照するだけで使用できます。 関数パラメーターを除き、変数は明示的には宣言されません。 初期化されていないスカラー変数と配列エレメントは、数値 0 と null 文字列 (" ") の文字列値の両方を持っています。
変数は、コンテキストに従って、数値または文字列値をとります。 各変数は、数値、文字列値、またはこの両方を持つことができます。 次に例を示します。
x = "4" + "8"
以下の値を割り当てます。12変数にxストリング定数の場合、式は "" で囲む必要があります。 (二重引用符)。
数字と文字列の間の明示的な変換はありません。 強制的に式を数値として処理するには、式に 0 を追加します。 式を文字列として処理するには、末尾に null 文字列 (" ") を追加します。
フィールド変数 (Field Variables)
フィールド変数は、$ (ドル記号) とそれに続く数値または数値式で指定します。 レコードの最初のフィールドに $1 変数、2 番目のフィールドに $2 変数というように、順に割り当てられます。 $0 フィールド変数はレコード全体に割り当てられます。 値を割り当てることによって、新しいフィールド変数を作成できます。 存在しないフィールド、つまり $NF フィールド変数の値より現行値が大きいフィールドに値を割り当てると、中間フィールドが (null 文字列に設定されて) 自動的に作成され、NF 特殊変数の値が増加し、$0 レコード変数の値が自動的に再計算されます。 新規フィールドは、現行のフィールド分離文字 (つまり FS 特殊変数の値) で区切られます。 デフォルトのフィールド分離文字はブランクおよびタブです。 フィールド分離文字を変更するには、-F フラグを使用するか、または awk コマンド・プログラムの中で FS 特殊変数に別の値を割り当てます。
アレイ
配列は、最初は空であり、サイズが動的に変化します。 配列は、[ ] (大括弧) で囲んだ添え字を持つ変数によって表されます。 添え字つまりエレメント ID は、文字列の数字であり、結合配列の機能のタイプを示します。 例えば、次のプログラムを見てください。
/red/ { x["red"]++ }
/green/ { y["green"]++ }
両方のカウントを増分します。redカウンターとgreenカウンター。
配列は、幾つかのプログラミング言語の多次元配列と同様に、2 つ以上の添え字を使って索引付けできます。 awk コマンドのプログラミング配列は現実に 1 次元なので、コンマで区切られた添え字は、別の式の文字列値を連結し各式を SUBSEP 環境変数の値によって区切った、単一の文字列に変換されます。 したがって、次の 2 つの索引操作は同じです。
x[expr1, expr2,...exprn]
および
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]
in 演算子を使用するときは、多次元の Index 値は括弧で囲む必要があります。 in 演算子の場合を除き、存在しない配列エレメントを参照すると、そのエレメントが自動的に作成されます。
特殊変数
次の変数は、awk コマンドの場合は特別な意味になります。
項目 | 説明 |
---|---|
argc | ARGV 配列内のエレメント数。 この値は変更できます。 |
argv | 各メンバーに File 変数または Assignment 変数の 1 つが入っている配列。これらの変数は、コマンド・ラインから順に取り込まれ、0 から ARGC -1 までの番号が付きます。 各入力ファイルが終了すると、ARGV 配列の次のメンバーが次の入力ファイルの名前を与えます。ただし、次の場合を除きます。
|
CONVFMT (会話) | 数字を文字列に変換する printf 構文 (OFMT 特殊変数を使用する出力ステートメントを除く)。 デフォルトは "% .6g" です。 |
ENVIRON | awk コマンドの操作環境を表す配列。 この配列の各エレメントは次のフォーマットになります。 ENVIRON [ "環境 VariableName" ] = EnvironmentVariable値 awk コマンドが実行を開始すると値が設定され、 ENVIRON 特殊変数が途中で変更されてもそれに関係なく、実行が終わるまでは同じ環境が使用されます。 |
ファイル名 | 現行の入力ファイルのパス名。 BEGIN アクションの実行中は、FILENAME の値は未定義です。 END アクションの実行中は、この値は最後に処理された入力ファイルの名前になります。 |
FNR | 現行ファイル内の現行入力レコードの数。 |
FS | 入力フィールド分離文字。 デフォルト値はブランクです。 入力フィールド分離文字がブランクの場合には、ロケール定義のスペースをいくつでも使ってフィールドを分離できます。 FS 特殊変数は、このほかに次の 2 つの値をとることができます。
|
NF | 現行レコード内のフィールド数 (最大 99)。 BEGIN アクション内では、NF 特殊変数は、Variable パラメーターが指定されていない getline 関数が先に実行されていない限り、未定義の状態です。 END アクションの内部では、NF 特殊変数は、END アクションを入力する前に、Variable パラメーターを指定せずに後続のリダイレクトされた getline 関数が実行されない限り、前回のレコード読み取り時の値を維持します。 |
NR | 現行の入力レコードの番号。 BEGIN アクション内では、NR 特殊変数の値は 0 です。 END アクション内では、この値は最後に処理されたレコードの番号です。 |
オFMT (FMT) | 出力ステートメント内で数字を文字列に変換する printf 構文。 デフォルトは "%.6g" です。 |
OFS とは | 出力フィールド分離文字 (デフォルトはスペース)。 |
RS | 出力レコード分離文字 (デフォルトは改行文字)。 |
長さ | match 関数で一致した文字列の長さ。 |
rs | 入力レコード分離文字 (デフォルトは改行文字)。 RS 特殊変数が null の場合は、レコードは 1 つ以上のブランク行のシーケンスで分離されます。 先頭または末尾のブランク行が、入力の始めまたは終わりで空のレコードになることはありません。 また、FS 特殊変数の値にかかわらず、改行文字は常にフィールド分離文字です。 |
RSTART (R) | match 関数によってマッチングされるストリングの開始位置 (1から番号付け)。 match 関数の戻り値と同等です。 |
SUBSEP | 複数の添え字を分離します。 デフォルトは ¥031 です。 |
フラグ
項目 | 説明 |
---|---|
-f ProgramFile | ProgramFile 変数で指定されたファイルから、awk コマンドの命令を取得します。 -f フラグを複数回指定すると、ファイルを指定順に連結したものが命令セットとして使用されます。 |
-u | バッファーされないモードで出力を表示します。 このフラグが使用された場合、awk コマンドは出力をバッファーに入れません。 代わりに、出力を即座に表示します。 デフォルトでは、awk コマンドはバッファー付きモードで出力を表示します。 |
-F (R) エーレ | Ere 変数で指定された拡張正規表現がフィールド分離文字として使用されます。 デフォルトのフィールド分離文字はブランクです。 |
-v (V) 割り当て | awk コマンドのプログラミング言語の変数に値を割り当てます。 Assignment パラメーターのフォーマットは Name = Value です。 Name 部分は変数名を示し、下線、数字、および英字を自由に組み合わせて指定できますが、先頭は英字または下線でなければなりません。 Value 部分も、下線、数字、および英字で構成され、文字列値と同様に、前後を " (二重引用符) で囲まれているものとして取り扱われます。 Value 部分が数値の場合は、変数にもその数値が割り当てられます。 -v フラグで指定された割り当ては、BEGIN セクションを含めて、awk コマンドのプログラムのどの部分もまだ実行されないうちに行われます。 |
代入演算子 | awk コマンドのプログラミング言語の変数に値を割り当てます。 -v フラグが指定された Assignment 変数と同じ形式と機能を持ちますが、それぞれが処理される時間だけが異なります。 Assignment パラメーターは、コマンド・ラインでこのパラメーターのあとに続く入力ファイル (File 変数で指定されたもの) の直前に処理されます。 複数の入力ファイルの先頭ファイルの直前に Assignment パラメーターを指定した場合は、割り当ては BEGIN セクション (もしあれば) の直後に処理されます。 Assignment パラメーターが最後のファイルのあとにある場合は、割り当ては END セクション (もしあれば) の前に処理されます。 入力ファイルを指定しなければ、割り当ては標準入力の読み取り時に処理されます。 |
File | 処理用の入力が入っているファイルの名前を指定します。 File 変数を指定しなかった場合、または - (負) 符号を指定した場合は、標準入力が処理されます。 |
'プログラム' | awk コマンド用の命令が入っています。 -f フラグを指定しない場合は、Program 変数がコマンド・ラインの最初の項目でなければなりません。 また、' ' (単一引用符) で囲む必要があります。 |
終了状況
このコマンドは、以下の終了値を戻します。
項目 | 説明 |
---|---|
0 | 正常終了。 |
>0 | エラーが発生しました。 |
出口 [ 式 ] 条件ステートメントを使用して、プログラム内の終了状況を変更できます。
例
- ファイルの中にある 73 文字以上の行を表示するには、次のように入力します。
これにより、次の各行が選択されます。chapter1ファイルは 72 文字より長く、 処置 が指定されていないため、これらの行を標準出力に書き込みます。 タブ文字は 1 バイトとして計算されます。awk 'length >72' chapter1
- 単語の間のすべての行を表示するには startおよびstop,組み込み "start"および "stop",以下のように入力します。
awk '/start/,/stop/' chapter1
- アーク コマンド・プログラムを実行するには、sum2.awk,ファイルを処理します。chapter1次のように入力します。
以下のプログラムは、sum2.awk入力ファイルの 2 番目の列の数値の合計と平均を計算します。chapter1:awk -f sum2.awk chapter1
最初のアクションは、各行の 2 番目のフィールドの値を変数に追加します。sumすべての変数は、最初に参照されたときに 0 (ゼロ) の数値に初期化されます。 2 番目のアクションの前にパターン END があるので、2 番目のアクションはすべての入力ファイルの読み取りが終わってから実行されます。 NR 特殊変数は、平均計算に使用されるもので、読み取られたレコード数を示します。{ sum += $2 } END { print "Sum: ", sum; print "Average:", sum/NR; }
- 最初の 2 つのフィールドを逆の順序で表示するには、次のように入力します。
awk '{ print $2, $1 }' chapter1
- awk プログラムを以下に示します。
ファイルの最初の 2 つのフィールドを印刷します。chapter2入力フィールドをコンマまたはブランク (あるいはその両方) で区切った後、最初の列を合計し、合計と平均を出力します。awk -f sum3.awk chapter2
BEGIN {FS = ",|[ \t]+"} {print $1, $2} {s += $1} END {print "sum is",s,"average is", s/NR }