awkコマンド(テキストの加工やパターン処理をする)

形式

awk[-F 入力フィールドセパレータ][-v 変数名=変数値]...[-f スクリプトファイルのパス名スクリプト
  [[対象パス名...]|[組み込み変数名=変数値...]]...

機能

テキストファイル内の各行(以降,レコードと呼びます)に対して特定のパターンに一致する行を検索し,一致した行に対して指定した処理をします。

引数

-F 入力フィールドセパレータ
入力フィールドセパレータの値を指定します。この指定値がawkコマンドの組み込み変数FSの値となります。
-v 変数名=変数値
変数名とその値を指定します。変数名とその値は,-fオプションに指定したスクリプトファイルまたは引数に指定したスクリプトに渡されます。複数個指定できます。同じ変数名を複数回指定した場合,最後に指定した値が設定されます。
-f スクリプトファイルのパス名
入力ファイルを検索するパターンおよびパターンと一致したレコードに対しての処理命令を記述したファイル(スクリプトファイル)のパス名を指定します。
  • パス名に「-」を指定した場合は,標準入力から入力します。
  • -fオプションは19個まで指定できます。
スクリプト
入力ファイルを検索するパターンおよびパターンと一致したレコードに対しての処理命令を,引数として指定します。
対象パス名
処理対象とするファイルのパス名を指定します。複数指定できます。
パス名を指定しない,またはパス名に「-」を指定した場合は,標準入力から入力します。なお,BEGINパターンだけの実行の場合は,指定したファイルまたは標準入力からレコードは入力しません。
組み込み変数名=変数値
組み込み変数名およびその値を指定します。変数名とその値は,-fオプションに指定したスクリプトファイルまたは引数に指定したスクリプトに渡されます。
  • 組み込み変数の説明に記述されていない名称を指定した場合は,-vオプションと同じになります。
  • すべての対象パス名の前に指定した場合は,BEGINパターン処理を除くすべてのファイル処理とENDパターン処理で有効となります。
  • すべての対象パス名のあとに指定した場合は,ENDパターン処理だけで有効となります。
  • 対象パス名の間に指定した場合は,この指定以降のパス名の処理とENDパターン処理で有効となります。

スクリプト(パターンおよびアクション)

awkコマンドで実行するスクリプトの記述形式を次に示します。

パターン][{[アクション]}]

パターンには,入力ファイルを検索するパターンを記述します。パターンに記述できる内容については,「パターンの種類」を参照してください。アクションには,パターンと一致したレコードに対しての処理命令を記述します。

入力ファイルから1レコードを入力するたびにパターンと比較し,パターンに一致した場合にアクションが実行されます。パターンを省略した場合は,すべてのレコードがアクション実行の対象となります。

アクションは,パターンと一致したレコードに対する制御文や関数を使用した処理を記述します。アクションには,制御文,組み込み関数,ユーザー定義関数,変数,または演算子を指定して動作を記述できます。処理は複数の文を記述でき,各文は改行またはセミコロンで区切ります。アクションを省略した場合,レコードの内容を標準出力に出力します。なお,{ }で囲んだ部分のアクションだけを省略した場合は,パターンと一致したレコードに対する処理は行われません。

コメントを記述する場合は,コメントの前に「#」を記述します。「#」以降から行末までをコメントとして扱います。

レコードとフィールド

レコードとは,入力レコードセパレータで分割した単位のことです。入力レコードセパレータの値は改行文字です。Windowsの場合,[CR]+[LF]または[LF]が改行文字と見なされます。UNIXの場合,[LF]が改行文字と見なされます。なお,UNIXの場合,入力ファイルの各レコードが[CR]+[LF]で区切られているときは,分割されたレコードには[CR]が含まれます。

入力レコードセパレータは,組み込み変数RSにレコードの区切りを示す1バイトの文字を設定することによって変更できます。文字列を指定した場合は,先頭の1文字を設定します。

レコードはフィールドセパレータによって,フィールドと呼ばれる単位に分割されます。フィールドセパレータのデフォルト値はスペースです。フィールドセパレータは-fオプションまたは組み込み変数FSにフィールドの区切りを示す文字列を設定することで変更できます。

アクションには,入力情報として入力ファイルから現在読み込んでいるレコードの内容およびレコードの各フィールドの値が渡されます。レコードの内容はフィールド変数の$0に格納されます。各フィールドの値は,レコードの最初のフィールドがフィールド変数$1,2番目のフィールドがフィールド変数$2というように順に格納されます。

パターンの種類

入力ファイルを検索するパターンには次の指定ができます。

制御文

使用できる制御文を次の表に示します。if文,while文,for文,do文,break文,continue文,return文の構文規則はC言語と同じです。ただし,for文の初期化式と再初期化式は1つの式だけ指定できます。

制御文構文内容
if文if (条件式) 処理 [else 処理]条件分岐します。
if (変数 in 配列) 処理[else 処理]変数に指定した添え字の配列要素が配列に存在するかどうかを判定します。
while文while (条件式) 処理条件が成立している間,繰り返します。
for文for (初期化式; 継続条件式; 再初期化式) 処理繰り返し実行します。
for (変数 in 配列) 処理各配列要素の添え字の値を順次取り出しながら処理します。添え字の値の取り出しは順不同です。
do文do 処理 while (継続条件式)後判定によって条件が成立している間,繰り返します。
break文break繰り返し処理を抜けます。
continue文continue繰り返し処理を中断して,繰り返し処理の先頭に戻ります。
next文next処理中の入力レコードに対して,この制御文以降の処理を停止し,次の入力レコードの処理を開始します。
nextfile文nextfile処理中の入力ファイルに対して,この制御文以降の処理を停止し,次の入力ファイルの処理を開始します。
return文return [expr]ユーザー定義関数を終了します。式exprで指定した値を呼び出し元に返します。式exprを指定しない場合は,0がユーザー定義関数の戻り値となります。
delete文delete 配列配列を削除します。
delete 配列[要素]配列の要素を削除します。
exit文exit [expr]処理中のスクリプトの実行を停止します。式exprで指定した値をコマンドの戻り値として返します。式exprを指定しない場合は,0がコマンドの戻り値となります。
式exprで指定した値は符号付きの4バイトの数値として扱います。Windowsの場合,式exprで指定した値がコマンドの戻り値となります。UNIXの場合,式exprで指定した値が0~255の範囲外のときは,値の下位8ビットがコマンドの戻り値となります。JP1/Advanced Shellのジョブ定義スクリプトから実行する場合は,0~255の範囲の値を指定してください。
WindowsでJP1/Advanced Shellのジョブ定義スクリプトから実行する場合,式exprで指定した値が0~255の範囲外のときは,コマンドの呼び出し元に返す戻り値は式exprで指定した値とは異なります。JP1/Advanced Shellでのコマンドの戻り値の扱いについては「5.9.8 ジョブ,ジョブステップおよびコマンドの終了コード」を参照してください。

組み込み関数

使用できる組み込み関数を次に示します。

ユーザー定義関数

組み込み関数以外に独自の関数を定義できます。構文を次に示します。

function|func name([param[,…]]) { statements }

関数名nameに使用できる文字は,英数字および_(アンダースコア)だけです。また,先頭文字は数字以外でなければなりません。

関数の引数paramにはユーザー定義の変数または配列の名称を指定できます。関数へ渡す引数は,ユーザー定義の変数は値渡しで,配列は参照渡しで行われます。

関数定義で指定した引数の数と,関数呼び出し時に指定した引数の数が異なっていても解析エラーにはなりません。ただし,関数呼び出し時に指定した引数の数が関数定義で指定した引数の数よりも多い場合は,警告メッセージが出力されます。関数の定義で指定した引数は,ローカル変数としますが,関数呼び出し時に指定した引数の数が関数定義で指定した引数の数よりも多い場合は,関数呼び出し時の余分な引数はグローバル変数と見なされます。

関数の定義で指定できる引数の数は50個までです。また,関数呼び出し時に指定できる引数の数も50個までです。なお,引数の数が50個以内かどうかは,関数の呼び出し時にチェックされます。

変数

スクリプトで使用する変数にはユーザー定義変数,フィールド変数,組み込み変数および配列があります。ユーザー定義変数と配列はスクリプト内で最初に使用したときに生成されます。なお,初期化されていない(演算や代入などの式で使用されていない)変数の初期値は,数値としては0,文字列値としてはNULLが格納されます。

変数の値の型は,変数が使用されるごとに,使用方法に合わせて数値または文字列に変化します。ただし,文字列が数字以外の場合は0の数値とします。例えば,次に示す2つのprint関数の出力結果は両方とも7が出力されます。

x = "3" + "4"
y = 3 + 4
print x
print y

変数ごとに説明します。

  a = 1
  print $a
  print $1

演算子

使用できる演算子を優先順位の低い順に次の表に示します。式の中で同じ優先順位の演算子は,式の左側に記述された演算子の優先順位が高くなります。

演算子説明
=,+=,-=,*=,/=,%=,^=,**=代入演算子です。
?:三項演算子です。
||論理ORです。
&&論理ANDです。
~,!~正規表現の一致(~)と不一致(!~)です。
<,<=,>,>=,!=,==関係演算子です。
スペース文字列連結です。
+,-加算および減算です。
*,/,%乗算,除算および剰余です。
+,-,!単項および論理否定です。
^,**累乗です。
++,--インクリメントおよびデクリメントです。

出力書式

printf関数およびsprintf関数で,変換指定を示す%と共に指定する変換指定子を次の表に示します。

文字説明
c1バイト文字です。
s文字列です。
d符号付き10進整数です。
i
o符号なし8進整数です。
x符号なし16進整数です。10~15の値には「abcdef」を使用します。
X符号なし16進整数です。10~15の値には「ABCDEF」を使用します。
u符号なし10進整数です。
f浮動小数点数です。[-]dddd.dddd形式に変換します。
e浮動小数点数です。[-]d.dddde[+-]dd[d]形式に変換します。
g変換指定子eまたはfで出力される符号付きの値のうち,指定された値および精度を表現できる短い方の書式です。末尾の0は出力されません。
E浮動小数点数です。[-]d.ddddE[+-]dd[d]形式に変換します。
G変換指定子Eまたはfで出力される符号付きの値のうち,指定された値および精度を表現できる短い方の書式です。末尾の0は出力されません。
%%の文字です。

エスケープ文字

-Fオプションの入力フィールドセパレータ,-vオプションの変数値,引数で指定する組み込み変数の変数値,パターンおよび変数への代入などで指定する"(ダブルクォーテーション)で囲まれた文字列にはエスケープ文字を使用できます。使用できるエスケープ文字を次の表に示します。

エスケープ文字意味
¥aアラート文字(ベル)
¥bバックスペース文字
¥fフォームフィード文字(改ページ)
¥n改行文字
¥r復帰文字
¥tタブ文字
¥v垂直タブ文字
¥d,¥dd,¥ddd1~3桁の8進数で表された文字※1。0を意味する数値は指定できません。
¥xhex16進値で表された文字(0~9,a~f,A~F)※1※2。0を意味する数値は指定できません。
¥c任意のリテラル文字(「¥"」の場合「"」)
¥¥1つのバックスラッシュ文字
注※1
スラッシュ(/)で囲んだパターン及び正規表現に指定する場合,実行時の文字コード種別によっては指定できない値があります。文字コード種別ごとに指定可能な値を16進数値で示します。なお,次の値以外を指定した場合はエラー終了します。
・文字コード種別:シフトJIS
0x01-0x80,0xA0-0xDF,0xFD-0xFF
・文字コード種別:UTF-8
0x01-0xBF,0xFE-0xFF
・文字コード種別:EUC
0x01-0x8D,0x90-0xA0,0xFF
・文字コード種別:C
0x01-0xFF
注※2
ダブルクォーテーション(")で囲んだ文字列に¥xhexを指定する場合,「¥x」から16進表記外の文字が出てくる前までの文字を16進表記文字とします。16進表記文字が98文字を超える場合は98文字までとなります。ただし,16進表記文字が2文字を超える場合は,16進表記文字から16進値の変換結果は保証されません。

特殊ファイル名

getline関数で標準入力から入力したり,print関数およびprintf関数で標準出力,または標準エラー出力へ出力したりしたい場合に,それらの入力先および出力先を表す特殊ファイル名が使用できます。使用できる特殊ファイル名を次に示します。なお,特殊ファイル名をclose関数に指定しても無視されます。

特殊ファイル名意味
/dev/stdin標準入力
/dev/stdout標準出力
/dev/stderr標準エラー出力

戻り値

戻り値意味
0正常終了
1以上エラー終了
exit文で指定した値制御文のexit文で指定したコマンド戻り値

注意事項

使用例