Hitachi

JP1 Version 11 JP1/Advanced Shell 


8.4.1 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というように順に格納されます。

パターンの種類

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

文字列

フィールドまたはレコードから検索したい文字列をスラッシュ(/)で囲みます。指定する文字列には正規表現を使用できます。スラッシュ(/)自体を検索したい場合は,エスケープ文字(\)を使用します。「/\//」と指定します。

検索したい文字列に「hitachi」を指定する場合の例を次に示します。

/hitachi/{
(アクション)
}
関係式

関係演算子(>,>=,<,<=,==,!=)を使用し,特定のフィールドに対して比較をします。指定例を次に示します。

レコードの2番目のフィールドの内容が「hitachi」の場合にアクションを実行します。

$2 == "hitachi"{
(アクション)
}
パターンの組み合わせ

複数のパターンを組み合わせてアクション実行条件を記述します。使用できる組み合わせを次の表に示します。

書式

説明

パターン1 && パターン2

論理積の演算子で,パターン1およびパターン2に一致するレコードをアクションの実行対象とします。

パターン1 || パターン2

論理和の演算子で,パターン1またはパターン2に一致するレコードをアクションの実行対象とします。

パターン1 ? パターン2 : パターン3

三項演算子で,パターン1とパターン2に一致するレコードまたはパターン3に一致するレコードをアクションの実行対象とします。

! パターン

否定の演算子で,パターンに一致しないレコードをアクションの実行対象とします。

(パターン)

複数条件のパターンをグループ化します。

パターン1, パターン2

パターン1に一致するレコードから,パターン2に一致するレコードまでがアクションの実行範囲となります。なお,パターン2に指定したレコードがなく入力ファイルの終端に達した場合は,入力ファイルの最終レコードまでが範囲となります。ただし,複数の入力ファイルを指定した場合,次の入力ファイルでパターン2に一致するレコードを検索します。この書式は50個まで指定できます。

BEGIN

ファイル入力の開始前に実行するアクションに対するパターンです。アクションの記述を省略できません。また,ほかのパターンと組み合わせることはできません。なお,複数の入力ファイルを指定している場合は,最初のファイル入力開始前にアクションが実行されます。

END

ファイルの最後のレコードに対するアクション実行後,またはexit制御文で終了した場合に実行するアクションに対するパターンです。アクションの記述を省略できません。また,ほかのパターンと組み合わせることはできません。なお,複数の入力ファイルを指定している場合は,最後のファイルの最後のレコードに対するアクション実行後となります。

制御文

使用できる制御文を次の表に示します。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でのコマンドの終了コードの扱いについては「ジョブ,ジョブステップおよびコマンドの終了コード」を参照してください。

組み込み関数

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

数学関数

使用できる数学関数を次の表に示します。

関数名

内容

atan2(y,x)

y/xの逆正接を返します。単位はラジアンです。引数が不足している場合は1を返し,警告メッセージを出力します。

cos(x)

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

exp(x)

xの指数関数を返します。結果がオーバーフローまたはアンダーフローする場合は1を返し,警告メッセージを出力します。

int(x)

xの小数点以下を切り捨てて整数を返します。

log(x)

xの自然対数を返します。xが0または負の場合は1を返し,警告メッセージを出力します。

rand()

乱数nを返します(0≦n<1の範囲)。srand関数でシード値を設定しない場合は,コマンドを実行するたびに同じ値を返します。

sin(x)

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

sqrt(x)

xの平方根を返します。xが負の場合は1を返し,警告メッセージを出力します。

srand([expr])

式exprをrand関数用のシード値を設定して,設定したシード値を返します。exprを省略した場合は,時刻を基にしたシード値を設定します。

文字列関数

使用できる文字列関数を次の表に示します。マルチバイト文字は1文字として扱います。

関数名

内容

gsub(r, t[, s])

文字列s中のすべての正規表現rをtに置き換えます。sを省略した場合,$0(レコード全体が格納されているフィールド変数)を置き換え対象とします。tに&を指定した場合は,&が一致した文字列に置き換えられます。終了コードとして,置き換えた回数を返します。

index(s,t)

文字列s中の文字列tの位置を返します。文字列tがなかった場合は0を返します。

length[([s])]

文字列sの文字数を返します。sを指定しなかった場合は,$0(レコード全体が格納されているフィールド変数)の文字数を返します。

match(s, r)

文字列s中の正規表現rが現れる位置を返します。正規表現rがなかった場合には0を返します。また,RSTART組み込み変数には正規表現rに一致した文字列の位置が設定されます。不一致時は0になります。RLENGTH組み込み変数には正規表現rに一致した文字列の長さが設定されます。不一致時は-1になります。

sprintf(書式, [, ... ])

書式に従って,式を整形した結果の文字列を返します。書式については出力書式の説明を参照してください。

split(s, array[, fs])

文字列sをフィールドセパレータfsによってフィールド分割し,配列arrayに格納します。戻り値として配列の要素数を返します。分割した各フィールドの値は,配列arrayに,array[1],array[2],…,array[戻り値]の順に格納されます。

フィールドセパレータfsの指定を省略した場合は,フィールドセパレータとして組み込み変数FSの値が使用されます。

フィールドセパレータfsには文字列および正規表現を指定できます。また,フィールドセパレータfsに文字指定なしを示す「""」を指定した場合は,1文字ずつ分割されます。

sub(r, t[, s])

文字列s中に最初にあった正規表現rをtに置き換えます。sを省略した場合,$0(レコード全体が格納されているフィールド変数)を置き換え対象とします。tに&を指定した場合は,&が一致した文字列に置き換えられます。正規表現rがあった場合は終了コードとして1を返します。正規表現rがなかった場合は0を返します。

substr(s, m[, n])

文字列sのm番目の文字から最大n文字の部分文字列を返します。nを省略した場合は,m番目以降のすべての文字列を返します。

tolower(str)

文字列str中のすべての英大文字を英小文字に変換した文字列を返します。

toupper(str)

文字列str中のすべての英小文字を英大文字に変換した文字列を返します。

ビット操作関数

使用できる操作関数を次の表に示します。xおよびyは符号付きの4バイトの数値として扱います。

関数名

内容

compl(x)

整数xの1の補数を返します。

and(x, y)

整数xと整数yのビットごとの論理積を返します。

or(x, y)

整数xと整数yのビットごとの論理和を返します。

xor(x, y)

整数xと整数yのビットごとの排他的論理和を返します。

lshift(x, n)

整数xをビット数n分,左にシフトした値を返します。ビットのシフトは算術シフトで行われるため,符号部分もシフト対象となります。

rshift(x, n)

整数xをビット数n分,右にシフトした値を返します。ビットのシフトは算術シフトで行われるため,符号部分は右にシフトした時に補てんする符号として扱われます。

入出力関数

使用できる入出力関数を次に示します。

getline [変数名]

現在の入力ファイルから次のレコードを入力します。変数名が指定されている場合は変数名で指定した変数にレコードを入力し,組み込み変数のNRおよびFNRが設定されます。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNF,NRおよびFNRが設定されます。レコードの入力に成功すると1を返し,ファイルの終端に到達すると0を返し,エラーが発生すると-1を返します。

getline [変数名] < パス名

パス名に指定したファイルから次のレコードを入力します。パス名は"(ダブルクォーテーション)で囲んで指定します。パス名の代わりにパス名を代入した変数の名称も指定できます。パス名に「-」を指定した場合は標準入力から入力します。

指定例を次に示します。

getline line < "file001.txt"

変数名が指定されている場合は変数名で指定した変数にレコードを入力します。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNFが設定されます。

指定したファイルは,getline関数で最初にレコードを受け取るときにオープンし,awkコマンドが終了するまでオープンしたままとなります。このため,同じファイルに対して再度先頭レコードから入力を開始したい場合は,close関数を実行する必要があります。

コマンド名 | getline [変数名]

コマンド名で指定したプログラムがパイプに出力したレコードを,getline関数を使用して入力します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。

変数名が指定されている場合は,変数名で指定した変数にレコードを入力します。変数名の指定を省略した場合は,フィールド変数$0にレコードを入力し,組み込み変数のNFが設定されます。指定例を次に示します。

コマンドがパイプに出力した内容から1レコード分を入力し,フィールド変数$0に代入します。

"cat -n file01.txt" | getline

コマンド名を変数に代入し,変数名とgetline関数を接続して実行します。

rtxt = "cat -n file01.txt"
rtxt | getline

指定したプログラムの出力を受け取るためのパイプ作成とプログラム実行は,「コマンド名 | getline [変数名]」実行時に行われます。同じコマンド名を複数回実行する場合,パイプ作成とプログラム実行が行われるのは最初に指定したコマンド名の実行のときだけです。作成されたパイプはawkコマンドが終了するまで存在します。このため,コマンド名で指定したプログラムを再実行したい場合は,close関数を実行する必要があります。次に例を示します。

"cat -n file01.txt" | getline rec        →1.
"cat -n file01.txt" | getline rec        →2.
close("cat -n file01.txt")               →3.
"cat -n file01.txt" | getline rec        →4.

パイプの作成およびcatコマンドの実行が行われ,catコマンドがパイプに出力した1番目のレコードの内容が変数recに格納されます。

catコマンドがパイプに出力した2番目のレコードの内容が変数recに格納されます。

パイプが閉じられます。

パイプの作成およびcatコマンドの実行が行われ,catコマンドがパイプに出力した1番目のレコードの内容が変数recに格納されます。なお,コマンド名の記述内容がprint関数およびprintf関数で指定するコマンド名の記述内容と同じでも別のコマンド名の記述と見なされます。

print [[, ... ]]

式を標準出力に出力します。式を省略した場合は,現在の入力レコードを標準出力に出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。

print [[, ... ]] > パス名

式をパス名で指定したファイルに出力します。パス名は"(ダブルクォーテーション)で囲んで指定します。パス名の代わりにパス名を代入した変数の名称も指定できます。式を省略した場合は,現在の入力レコードをパス名で指定したファイルに出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。既存ファイルに追加書きで出力する場合は「>>パス名」で指定します。

指定したファイルは,print関数で最初に出力するときにオープンし,awkコマンドが終了するまでオープンしたままとなります。このため,同じファイルに対して,ファイルの先頭から出力したい場合はclose関数を実行する必要があります。

print [[, ... ]] | コマンド名

式をパイプに出力し,コマンド名で指定したプログラムに渡します。

コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。

式を省略した場合は,現在の入力レコードをパイプに出力します。式をコンマ(,)で区切って複数指定した場合,各式は組み込み変数OFSの値で区切られます。出力レコードの終端には組み込み変数ORSの値が出力されます。

指定したプログラムへ出力結果を渡すためのパイプ作成とプログラム実行は,「print [式[, ... ]] | コマンド名」実行時に行われます。同じコマンド名を複数回実行する場合,パイプ作成とプログラム実行が行われるのは最初に指定したコマンド名の実行のときだけです。作成されたパイプはawkコマンドが終了するまで存在します。このため,コマンド名で指定したプログラムを再実行したい場合は,close関数を実行する必要があります。コマンド名の記述内容がgetline関数で指定するコマンド名の記述内容と同じでも別のコマンド名の記述と見なされます。

printf 書式[,[, ... ]]

書式に従って標準出力に出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]]」を参照してください。

Windowsの場合,改行文字を表す「\n」を指定したとき,出力先には[CR]+[LF]で出力されます。

printf 書式[,[, ... ]] >パス名

書式に従ってファイルに出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]] >パス名」を参照してください。

printf 書式[,[, ... ]] | コマンド名

書式に従ってパイプに出力します。書式については出力書式の説明を参照してください。その他の内容は「print [式[, ... ]] | コマンド名」を参照してください。コマンド名の内容がprint関数に指定したコマンド名と同じ場合は,同じプログラムの実行に対して出力します。

close(パス名|コマンド名)

getline関数,print関数,printf関数で使用したファイルまたはgetline関数,print関数,printf関数でコマンド名実行時に作成されたパイプをクローズします。

クローズに成功した場合は0を返します。失敗した場合は,ファイルのときはOSのclose関数の戻り値,パイプのときはOSのpclose関数の戻り値を返します。

引数にはgetline関数,print関数,printf関数で指定したパス名またはコマンド名を指定します。パス名は"(ダブルクォーテーション)で囲んで指定します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。また,getline関数,print関数,printf関数で指定したパス名やコマンド名が格納されている変数も指定できます。なお,close関数に記述するパス名やコマンド名は,getline関数,print関数,printf関数に記述したパス名やコマンド名の文字列と文字数も含めて同じにしてください。パス名やコマンド名の文字列が異なる場合,別のパス名または別のコマンド名と見なされます。1つのclose関数に指定したコマンド名がgetline関数,print関数またはprintf関数で指定したコマンド名と同じ場合は,getline関数で作成されたパイプとprint関数またはprintf関数で作成されたパイプの両方がクローズされます。指定例を次に示します。

print "hitachi"  | "cat -n"
close("cat -n")
fflush([パス名|コマンド名])

getline関数,print関数,printf関数で使用したファイルまたはgetline関数,print関数,printf関数でプログラム実行時に作成されたパイプをフラッシュします。フラッシュに成功した場合は0を返します。失敗した場合は,OSのfflush関数の戻り値を返します。

引数にはgetline関数,print関数,printf関数で指定したパス名またはコマンド名を指定します。パス名は"(ダブルクォーテーション)で囲んで指定します。コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。また,getline関数,print関数,printf関数で指定したパス名やコマンド名が格納されている変数も指定できます。なお,fflush関数に記述するパス名やコマンド名は,getline関数,print関数,printf関数に記述したパス名やコマンド名の文字列と文字数も含めて同じにしてください。パス名やコマンド名の文字列が異なる場合,別のパス名または別のコマンド名と見なされます。

引数の指定を省略した場合は,すべてのファイルとパイプをフラッシュします。

汎用関数

使用できる汎用関数を次の表に示します。

関数名

内容

system(コマンド名)

コマンド名に指定したプログラムを実行し,実行したプログラムのステータスを返します。

コマンド名は,実行するプログラムの名称とその引数の値を"(ダブルクォーテーション)で囲んで,コマンドライン形式で記述します。コマンド名の代わりにコマンド名を代入した変数の名称も指定できます。

UNIXの場合,実行したプログラムのステータスは,プログラムが返す終了コードの下位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

変数ごとに説明します。

注※

次の場合,「print $a」および「print $1」は同じ内容が出力されます。

a = 1
print $a
print $1

演算子

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

演算子

説明

=,+=,-=,*=,/=,%=,^=,**=

代入演算子です。

?:

三項演算子です。

||

論理ORです。

&&

論理ANDです。

~,!~

正規表現の一致(~)と不一致(!~)です。

<,<=,>,>=,!=,==

関係演算子です。

スペース

文字列連結です。

+,-

加算および減算です。

*,/,%

乗算,除算および剰余です。

+,-,!

単項および論理否定です。

^,**

累乗です。

++,--

インクリメントおよびデクリメントです。

出力書式

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

文字

説明

c

1バイト文字です。

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は出力されません。

%

%の文字です。

エスケープ文字

次の個所にはエスケープ文字を使用できます。

使用できるエスケープ文字を次の表に示します。

エスケープ文字

意味

\a

アラート文字(ベル)

\b

バックスペース文字

\f

フォームフィード文字(改ページ)

\n

改行文字

\r

復帰文字

\t

タブ文字

\v

垂直タブ文字

\d,\dd,\ddd

1〜3桁の8進数で表された文字※1。0を意味する数値は指定できません。

\xhex

16進値で表された文字(0〜9,a〜f,A〜F)※1※2。0を意味する数値は指定できません。

\c

任意のリテラル文字(「\"」の場合「"」)

\\

1つのバックスラッシュ文字

注※1

スラッシュ(/)で囲んだパターンおよび正規表現に指定する場合,実行時の文字コード種別によっては指定できない値があります。

文字コード種別ごとに指定できる値を次の表に16進数値で示します。なお,次の値以外を指定した場合はエラー終了します。

文字コード種別

指定できる値(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進値の変換結果は保証されません。

なお,-vオプションの変数値や,引数で指定する組み込み変数の変数値に指定した\は,エスケープ文字として扱われます(シングルクォーテーションで囲んでいるケースを除く)。そのため,パス名を指定するときは注意が必要です。例を次に示します。

(例1)正しいパス名(d:\a\b\c)をawkコマンドのスクリプトに渡せない例

この例では,\がエスケープ文字として処理されて\が削除された結果,VAR001にはc:\a\b\cが設定されます。

その後,awkコマンドの変数に設定される際には再び\がエスケープ文字として処理され,最終的にVAR001にはc:abcが設定されます。

CCC01="c:\\a\\b\\c"
awk -v VAR001="${CCC01}"  -f prog01.awk

同様に次の2つの例も正しいパス名を渡せません。

awk -v VAR001=c:\\a\\b\\c  -f prog01.awk
awk -v VAR001='c:\a\b\c'  -f prog01.awk
(例2)正しいパス名(d:\a\b\c)をawkコマンドのスクリプトに渡せる例

この例では,CCC01,CCC02の両方ともc:\\a\\b\\cが格納されます。

その後,awkコマンドのVAR001へ格納される際にはc:\a\b\cとなり,正しく処理できます。

CCC01='c:\\a\\b\\c'
CCC02="c:\\\\a\\\\b\\\\c"
awk -v VAR001="${CCC01}"  -f prog01.awk
awk -v VAR001="${CCC02}"  -f prog01.awk

同様に次の2つの例も正しいパス名を渡せます。

awk -v VAR001=c:\\\\a\\\\b\\\\c  -f prog01.awk
awk -v VAR001='c:\\a\\b\\c'  -f prog01.awk

特殊ファイル名

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

特殊ファイル名

意味

/dev/stdin

標準入力

/dev/stdout

標準出力

/dev/stderr

標準エラー出力

終了コード

終了コード

意味

0

正常終了

1以上

エラー終了

exit文で指定した値

制御文のexit文で指定したコマンドの終了コード

注意事項

使用例