Linuxコマンドを学ぶ - gawk

gawkパターンスキャンと処理言語

シノプシス

gawk [POSIXまたはGNUスタイルのオプション] -f program-file [ - ] file ...
gawk [POSIXまたはGNUスタイルオプション] [ - ] プログラムテキストファイル...

pgawk [POSIXまたはGNU形式のオプション] -f program-file [ - ] file ...
pgawk [POSIXまたはGNUスタイルオプション] [ - ] プログラムテキストファイル...

説明

GawkGNUプロジェクトのAWKプログラミング言語の実装です。 これは、POSIX 1003.2コマンド言語およびユーティリティ標準の言語の定義に準拠しています。 このバージョンは、Aho、Kernighan、WeinbergerによるThe AWK Programming Languageの記述に基づいており、System V Release 4バージョンのUNIX awkに追加されています。 Gawkはさらに最近のBell Laboratoriesのawk拡張といくつかのGNU固有の拡張を提供しています。

Pgawkgawkのプロファイリング版です。 これはgawkと全く同じですが、プログラムの実行速度が遅くなり、 awkprof.outファイルに実行プロファイルが自動的に生成されます。 下記の--profileオプションを参照してください。

コマンドラインは、 gwkオプション、AWKプログラムテキスト( -fまたは--fileオプションで指定されていない場合)、およびARGCおよびARGVで事前定義されたAWK変数で使用できる値で構成されています。

オプションフォーマット

Gawkオプションは、従来のPOSIXの1文字オプション、またはGNUスタイルの長いオプションのいずれかです。 POSIXオプションは単一の `` - ''で始まり、長いオプションは `` - ''で始まります。 長いオプションは、GNU固有の機能とPOSIXの必須機能の両方に提供されます。

POSIX標準に従うと、 gawk固有のオプションは-Wオプションに引数を指定して提供されます。 複数の-Wオプションを指定することができます-Wオプションにはそれぞれ、対応する長いオプションがあります(以下で詳しく説明します)。 ロングオプションへの引数は、オプションで=記号で結合されるか、間にスペースを入れないか、次のコマンドライン引数で指定することができます。 省略形が一意であれば、長いオプションを省略することができます。

オプション

Gawkはアルファベット順に以下のオプションを受け入れます。

-F fs

--field-separator fs入力フィールドセパレータ( FS定義済み変数の値)にfsを使用します。

-v var = val

--assign var = valプログラムの実行が始まる前に、値valを変数varに代入します。 このような変数値は、AWKプログラムのBEGINブロックで使用できます。

-f program-file

--file program-file最初のコマンドライン引数ではなく、 program-fileファイルからAWKプログラムのソースを読み込みます。 複数の-f (または--file )オプションを使用できます。

-mf NNN

-mr NNNさまざまなメモリー制限をNNN値に設定します。 fフラグはフィールドの最大数を設定し、 rフラグは最大レコードサイズを設定します。 これら2つのフラグと-mオプションは、Bell LaboratoriesのUNIX awkのリサーチバージョンからのものです。 gawkはあらかじめ定義された制限がないため、 gawkは無視します。

-W compat

-W伝統的な

--compat

--traditional 互換モードで実行します。 互換モードでは、 gawkUNIX awkと同じように動作します 。 GNU固有の拡張は認識されません。 --traditionalの使用は、このオプションの他の形式よりも優先されます。 詳細については、下記のGNU拡張を参照してください。

-W copyleft

-W著作権

--copyleft

--copyright GNU著作権情報メッセージの短いバージョンを標準出力に出力し、正常に終了します。

-W dump-variables [ = file ]

--dump-variables [ = file ]大域変数のソートされたリスト、型、最終値をファイルに出力ますファイルが指定されていない場合、 gawkは現在のディレクトリでawkvars.outという名前のファイルを使用します。

すべてのグローバル変数のリストを持つことは、プログラムの誤植を探す良い方法です。 大量の関数を持つ大規模なプログラムがあり、関数がローカルであることを意図したグローバル変数を誤って使用しないようにしたい場合は、このオプションを使用します。 (これは、 ijなどの単純な変数名で行うのが特に簡単な間違いです。)

-W help

-Wの使用法

- 助けて

--usage標準出力で利用可能なオプションの比較的短い要約を表示します。 ( GNUコーディング標準によれば、これらのオプションは即座に成功して終了する。)

-W lint [ =致命的 ]

--lint [ = fatal ]他のAWK実装に疑わしい、または移植性のない構文についての警告を提供します。 オプションで致命的な引数を指定すると、lintの警告は致命的なエラーになります。 これは劇的なことかもしれませんが、その使用は、きれいなAWKプログラムの開発を確実に促すでしょう。

-Wint-old

--lint-oldオリジナルのUnix awkに移植できない構文についての警告を表示します。

-W gen-po

--gen-po AWKプログラムをスキャンして解析し、標準出力にGNU .po形式のファイルを生成し、プログラム内のすべてのローカライズ可能な文字列のエントリを指定します。 プログラム自体は実行されません。 .poファイルの詳細については、GNU gettextディストリビューションを参照してください。

-W非小数データ

--non-decimal-data入力データの8進数と16進数を認識します。 このオプションは非常に注意して使用してください!

-W posix

--posix 互換モードを有効にします。これには次の追加制限があります。

*

\ xエスケープシーケンスは認識されません。

*

FSが単一のスペースに設定されている場合、スペースとタブのみがフィールド区切りとして機能し、改行はスペース区切りとして機能しません。

*

後に行を続けることはできませんか?

*

キーワードfunctionの同義語funcは認識されません。

*

^^ =の代わりに演算子**** =は使用できません。

*

fflush()関数は使用できません。

-W profile [ = prof_file ]

--profile [ = prof_file ] prof_fileにプロファイルデータを送信します 。 デフォルトはawkprof.outです。 gawkを使って実行すると、プロファイルはプログラムの「かなり印刷された」バージョンに過ぎません。 pgawkを使用して実行する場合、プロファイルには、プログラム内の各ステートメントの実行マージンが左マージンに含まれ、関数呼び出しカウントが各ユーザー定義関数に含まれます。

-W間隔

--re-interval正規表現マッチングで区間式を有効にします(下記の正規表現を参照)。 インターバル式はAWK言語では伝統的に利用できませんでした。 POSIX規格は、 awkegrepを互いに一貫させるためにそれらを追加しました。 しかし、それらの使用は古いAWKプログラムを壊す可能性があるので、 gawkはこのオプションで要求された場合、または--posixが指定された場合にのみそれらを提供します。

-Wソース プログラムテキスト

--source program-text AWKプログラムのソースコードとしてprogram-textを使用します。 このオプションは、コマンドラインで入力されたソースコードとライブラリ関数( -f--fileオプションで使用される)を簡単に混在させることを可能にします。 主にシェルスクリプトで使用される中規模から大規模のAWKプログラムを対象としています。

-Wバージョン

--version gawkのこの特定のコピーのバージョン情報を標準出力に出力します。 これは主に、あなたのシステム上のgawkの現在のコピーがフリーソフトウェア財団が配布しているものに関して最新であるかどうかを知るのに便利です。 これはバグを報告するときにも便利です。 ( GNUコーディング標準によれば、これらのオプションは即座に成功して終了する。)

-オプションの終わりを知らせる。 これは、AWKプログラム自体の引数を `` - ''で始めることができるようにするのに便利です。 これは主に、他のほとんどのPOSIXプログラムで使用されている引数解析規則との一貫性のためです。

互換モードでは、他のオプションは無効とフラグされますが、それ以外の場合は無視されます。 通常の操作では、プログラムテキストが提供されている限り、未知のオプションが処理のためにARGV配列のAWKプログラムに渡されます。 これは、 ``!! ''実行可能インタプリタ機構を介してAWKプログラムを実行する場合に特に便利です。

AWKプログラム実行

AWKプログラムは、一連のパターンアクション文とオプションの関数定義で構成されています。

パターン { アクション文 }

関数 パラメータリスト ){ ステートメント }

Gawkは指定されていればプログラムファイルから、 -- sourceへの引数から、またはコマンドラインの最初の非オプション引数からプログラムソースを読み込みます-fオプションと--sourceオプションは、コマンドラインで複数回使用できます。 Gawkは、すべてのプログラムファイルとコマンドラインソーステキストが連結されているかのように、プログラムテキストを読み取ります 。 これは、AWK関数を使用する新しいAWKプログラムにそれらを含めることなく、AWK関数のライブラリを構築するのに便利です。 また、ライブラリ関数とコマンドラインプログラムを混在させることもできます。

環境変数AWKPATHは、 -fオプションで指定されたソースファイルを見つけるときに使用する検索パスを指定します。 この変数が存在しない場合、デフォルトパスは"。:/ usr / local / share / awk"です。 (実際のディレクトリは、 gawkがどのようにビルドされ、インストールされたかによって異なるかもしれません) 。-fオプションに与えられたファイル名に `` / ''文字が含まれている場合、パス検索は実行されません。

Gawkは以下の順序でAWKプログラムを実行します。 まず、 -vオプションで指定されたすべての変数の代入が実行されます。 次に、 gawkはプログラムを内部形式にコンパイルします。 次に、 gawkBEGINブロック(存在する場合)にコードを実行し、 ARGV配列に指定された各ファイルを読み込みます。 コマンドラインで指定されたファイルがない場合、 gawkは標準入力を読み込みます。

コマンドラインのファイル名の形式がvar = valの場合、変数の代入として扱われます。 変数varに値valが代入されます。 (これはBEGINブロックが実行された後に行われます)コマンドライン変数の割り当ては、AWKが入力をフィールドやレコードにどのように分割するかを制御するために変数に動的に値を割り当てる場合に最も便利です。 1つのデータファイルに複数のパスが必要な場合は、状態を制御するのにも役立ちます。

ARGVの特定の要素の値が空( "" )の場合、 gawkはそれをスキップします。

入力の各レコードについて、 gawkはAWKプログラムのパターンと一致するかどうかをテストします。 レコードが一致するパターンごとに、関連するアクションが実行されます。 パターンはプログラム内で発生した順序でテストされます。

最後に、すべての入力が使い果たされた後、 gawkENDブロック(存在する場合)にコードを実行します。

変数、レコード、およびフィールド

AWK変数は動的です。 彼らは最初に使用されるときに存在します。 それらの値は、使用方法に応じて、浮動小数点数または文字列、またはその両方です。 AWKには1次元配列もあります。 複数の次元を有するアレイをシミュレートすることができる。 プログラムが実行されるときにいくつかの事前定義された変数が設定されます。 これらは必要に応じて説明され、以下に要約される。

記録

通常、レコードは改行文字で区切られます。 組み込み変数RSに値を割り当てることで、レコードの区切り方を制御することができます。 RSが単一の文字である場合、その文字はレコードを区切ります。 それ以外の場合、 RSは正規表現です。 この正規表現に一致する入力内のテキストがレコードを区切ります。 ただし、互換モードでは、文字列値の最初の文字のみがレコードを区切るために使用されます。 RSが空文字列に設定されている場合、レコードは空白行で区切られます。 RSがヌル文字列に設定されている場合、改行文字は、 FSが持つことができる値に加えて、フィールドセパレータとして常に機能します。

フィールド

各入力レコードが読み込まれると、 gawkFS変数の値をフィールドセパレータとして使用してレコードをフィールドに分割しますFSが単一の文字の場合、フィールドはその文字で区切られます。 FSが空文字列の場合、個々の文字はそれぞれ別のフィールドになります。 さもなければ、 FSは完全な正規表現であると予想されます。 FSが単一のスペースである特殊なケースでは、フィールドはスペースやタブ、改行で区切られます。 (しかし、以下の--posixの議論を見てください)。 注記: IGNORECASE (下記参照)の値は、 FSが正規表現である場合のフィールドの分割方法や、 RSが正規表現の場合にレコードがどのように分割されるかにも影響します。

FIELDWIDTHS変数が空白で区切られた数字のリストに設定されている場合、各フィールドは固定幅を持つと予想され、 gawkは指定された幅を使用してレコードを分割します。 FSの値は無視されます。 FSに新しい値を代入すると、 FIELDWIDTHSの使用がオーバーライドされ、デフォルトの動作が復元されます。

入力レコードの各フィールドは、 $ 1$ 2などの位置で参照されることがあります。 $ 0は全体のレコードです。 フィールドを定数で参照する必要はありません。

n = 5
$ nを印刷する

入力レコードに5番目のフィールドを出力します。

変数NFは、入力レコードのフィールドの合計数に設定されます。

存在しないフィールド( $ NFの後のフィールド)を参照すると、ヌル文字列が生成されます。 しかし、存在しないフィールド( $(NF + 2)= 5など )に割り当てると、 NFの値が増加し、null文字列を値として持つ介入フィールドが作成され、 $ 0の値が再計算されます。フィールドはOFSの値で区切られます。 負の番号のフィールドを参照すると、致命的なエラーが発生します。 NFを減らすと、新しい値を超えたフィールドの値が失われ、 OFSの値で区切られたフィールドが再計算され、 $ 0の値が再計算されます。

既存のフィールドに値を代入すると、 $ 0が参照されたときにレコード全体が再構築されます。 同様に、 $ 0に値を代入するとレコードが再分割され、フィールドの新しい値が作成されます。

ビルトイン変数

Gawkの組み込み変数は次のとおりです。

ARGC

コマンドライン引数の数( gawkのオプションやプログラムソースは含まれません)。

ARGIND

現在処理中のファイルのARGVのインデックス。

ARGV

コマンドライン引数の配列。 配列は0からARGC - 1に索引付けされます。ARGVの内容を動的に変更すると、データに使用されるファイルを制御できます。

BINMODE

非POSIXシステムでは、すべてのファイルI / Oに対して ``バイナリ ''モードの使用を指定します。 数値1,2または3は、入力ファイル、出力ファイル、またはすべてのファイルがそれぞれバイナリI / Oを使用するように指定します。 "r"または"w"の文字列値は、それぞれ入力ファイルまたは出力ファイルがバイナリI / Oを使用することを指定します。 "rw"または"wr"の文字列値は、すべてのファイルでバイナリI / Oを使用する必要があることを指定します。 その他の文字列値は"rw"として扱われますが、警告メッセージが生成されます。

CONVFMT

数値の変換フォーマット、 "%.6g" 、デフォルトで。

環境

現在の環境の値を含む配列。 配列は環境変数によって索引付けされ、各要素はその変数の値です(例: ENVIRON ["HOME"] / home / arnold )。 この配列を変更しても、リダイレクトまたはsystem()関数を介してgawkが生成されるプログラムの環境には影響しません。

ERRNO

getlineのリダイレクト中、 getlineの読み込み中、またはclose()中にシステムエラーが発生した場合、 ERRNOにはエラーを説明する文字列が含まれます。 この値は、英語以外のロケールでの翻訳の対象となります。

FIELDWIDTHS

空白で区切られたフィールド幅のリスト。 設定されると、 gawkは、 FS変数の値をフィールドセパレータとして使用するのではなく、固定幅のフィールドに入力を解析します。

ファイル名

現在の入力ファイルの名前。 コマンドラインでファイルが指定されていない場合、 FILENAMEの値は `` - ''です。 ただし、 FILENAMEBEGINブロック内では定義されていません( getlineで設定しない限り)。

FNR

現在の入力ファイルの入力レコード番号。

FS

入力フィールドセパレータ。デフォルトではスペースです。 上記のフィールドを参照してください。

IGNORECASE

すべての正規表現と文字列操作の大文字と小文字の区別を制御します。 IGNORECASEに 0以外の値が指定されている場合、ルールでの文字列比較とパターンマッチング、 FSでのフィールド分割、 RSでのレコード分割、 !〜との正規表現一致、 gensub()gsub()index()match()split() 、およびsub()組み込み関数は、すべて正規表現操作を実行するときに大文字小文字を無視します。 注:配列添字は影響を受けず、 asort()関数も影響しません。

したがって、 IGNORECASEがゼロでない場合、 / aB /はすべての文字列"ab""aB""Ab" 、および"AB"に一致します。 すべてのAWK変数と同様に、 IGNORECASEの初期値は0なので、正規表現と文字列演算はすべて大文字小文字を区別します。 Unixでは、大文字と小文字を区別しない場合、完全なISO 8859-1 Latin-1文字セットが使用されます。

LINT

AWKプログラム内で--lintオプションを動的に制御します。 trueの場合、 gawkはリント警告を出力します。 偽の場合、それはしません。 文字列値"fatal"が割り当てられた場合、lint警告は--lint = fatalのような致命的なエラーになります。 その他の真の値は警告を出力するだけです。

NF

現在の入力レコードのフィールド数。

NR

これまでに見た入力レコードの総数。

OFMT

数値の出力形式"%.6g"です。

OFS

出力フィールドセパレータ。デフォルトではスペースです。

ORS

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

PROCINFO

この配列の要素は、実行中のAWKプログラムに関する情報へのアクセスを提供します。 いくつかのシステムでは、アレイ内に要素が存在している可能性があります。 「グループ1」「グループ n n個あり 、プロセスが持つ補助グループの数です。 これらの要素をテストするには演算子inを使用します。 次の要素が使用可能であることが保証されています。

PROCINFO ["egid"]

getegid (2)システムコールの値。

PROCINFO ["euid"]

geteuid (2)システムコールの値。

PROCINFO ["FS"]

FSとのフィールド分割が有効な場合は「FS」FIELDWIDTHSを使用したフィールド分割が有効な場合は「FIELDWIDTHS」

PROCINFO ["gid"]

getgid (2)システムコールの値

PROCINFO ["pgrpid"]

現在のプロセスのプロセスグループID。

PROCINFO ["pid"]

現在のプロセスのプロセスID。

PROCINFO ["ppid"]

現在のプロセスの親プロセスID。

PROCINFO ["uid"]

getuid (2)システムコールの値

RS

入力レコード区切り文字。デフォルトで改行。

RT

レコードターミネータ。 Gawkは、 RSで指定された文字または正規表現に一致する入力テキストにRTを設定します。

RSTART

match()でマッチした最初の文字のインデックス。 一致しない場合は0。 (これは、文字インデックスが1から始まることを意味します)。

RLENGTH

match()でマッチした文字列の長さ。 一致がなければ-1。

SUBSEP

配列要素の複数の添字を区切るために使われる文字。デフォルトは"\ 034"です。

テキストのドメイン

AWKプログラムのテキストドメイン。 プログラムの文字列のローカライズされた翻訳を見つけるために使用されます。

配列

配列は角括弧( [] )で囲まれた式で添字付けされています。 式が式リスト( exprexpr ...)である場合、配列添字は、各式の(文字列)値の連結からなる文字列であり、 SUBSEP変数の値で区切られます。 この機能は、複数の次元の配列をシミュレートするために使用されます。 例えば:

i = "A"; j = "B"; k = "C"
x [i、j、k] = "こんにちは、世界\ n"

文字列"A \ 034B \ 034C"で索引付けされた配列xの要素に文字列"hello、world \ n"を割り当てます。 AWK内のすべての配列は連想的です。つまり、文字列値でインデックスされます。

特殊演算子inは、配列に特定の値で構成されるインデックスがあるかどう 調べるために、 ifまたはwhileステートメントで使用できます。

if(配列の中のval)print array [val]

配列に複数の添字がある場合は、配列に(i、j)を使用します。

in構造体は、 forループ内で配列のすべての要素を反復処理するためにも使用できます。

deleteステートメントを使用して配列から要素を削除することができます。 deleteステートメントは、添字なしで配列名を指定するだけで、配列の内容全体を削除するためにも使用できます。

可変タイピングと変換

変数とフィールドは、(浮動小数点)数値、文字列、またはその両方になります。 変数の値がどのように解釈されるかは、そのコンテキストに依存します。 数値式で使用される場合は数値として扱われ、文字列として使用される場合は文字列として扱われます。

変数を強制的に数値として扱うには、その変数に0を加えます。 それを文字列として扱うよう強制するには、それをヌル文字列と連結します。

文字列を数値に変換する必要がある場合、変換はstrtod (3)を使用して行います。 数値は変数の数値を引数としてsprintf (3)の書式文字列としてCONVFMTの値を使用して文字列に変換されます。 ただし、AWKのすべての数値は浮動小数点ですが、整数値は常に整数として変換されます。 したがって、与えられた

CONVFMT = "%2.2f" a = 12 b = a ""

変数bの文字列値は「12」でなく「12.00」です。

Gawkは次のように比較を実行します。2つの変数が数値の場合は数値で比較されます。 一方の値が数値で他方が ``数値文字列 ''である文字列値を持つ場合、比較も数値的に行われます。 それ以外の場合は、数値が文字列に変換され、文字列比較が実行されます。 2つの文字列は、もちろん、文字列として比較されます。 POSIX標準では、文字列定数に至るまで、どこでも "数値文字列"の概念が適用されることに注意してください。 しかし、これは明らかに誤りであり、 gawkはこれをしません。 (幸いにも、これは標準の次のバージョンで修正されています。)

"57"などの文字列定数数値文字列ではなく 、文字列定数です。 ``数値文字列 ''の考え方は、フィールド、 getline入力、 FILENAMEARGV要素、 ENVIRON要素、およびsplit()によって作成された数値文字列である配列の要素にのみ適用されます。 基本的な考え方は、 ユーザーの入力と 、数字で表示されるユーザー入力のみがそのように扱われるということです。

初期化されていない変数は、数値0と文字列値 ""(nullまたは空の文字列)を持ちます。

8進定数と16進定数

gawkのバージョン3.1からは、AWKプログラムのソースコードでCスタイルの8進定数と16進定数を使用することができます。 たとえば、8進数値011は10進9に等しく、16進数値0x11は10進17に等しくなります。

文字列定数

AWKの文字列定数は、二重引用符( " )で囲まれた文字列です。文字列内では、Cのように特定のエスケープシーケンスが認識されます。

\\

リテラルのバックスラッシュ。

\ a

``警告 ''文字。 通常はASCII BEL文字です。

\ b

バックスペース。

\ f

フォームフィード。

\ n

改行。

\ r

キャリッジリターン。

\ t

水平タブ。

\ v

垂直タブ。

\ x 16進数

\ xに続く16進数の文字列で表される文字。 ANSICの場合と同様に、16進数の数字はすべてエスケープシーケンスの一部とみなされます。 (この機能は、委員会による言語設計について教えてくれるはずです)。たとえば、 "\ x1B"はASCIIESC(エスケープ)文字です。

\ ddd

1桁、2桁、または3桁の8進数のシーケンスで表される文字。 たとえば、 「\ 033」はASCII ESC(エスケープ)文字です。

\ c

リテラル文字c

エスケープシーケンスは、定数正規表現(例えば、 / [\ t \ f \ n \ r \ v] /空白文字と一致)の中で使用することもできます。

互換モードでは、8進および16進のエスケープシーケンスで表される文字は、正規表現定数で使用されると文字通り扱われます。 したがって、 / a \ 52b // a \ * b /と等価です。

パターンとアクション

AWKは行指向言語です。 パターンが最初に来て、それから行動が起こります。 アクション文は{}で囲まれています。 パターンが欠落しているか、またはアクションが欠落している可能性がありますが、もちろん両方ではありません。 パターンが欠落している場合は、入力レコードごとにアクションが実行されます。 行方不明の行為は

{印刷}

レコード全体を印刷します。

コメントは ``# ''文字で始まり、行末まで続きます。 文を区切るために空白行を使用できます。 通常、ステートメントは改行で終わりますが、これは ``、 ''、 {}で終わる行には当てはまりません&& 、または||doまたはelseで終わる行も自動的に次の行に続くステートメントを持ちます。 それ以外の場合は、行を継続することができます。これを 'で終えると、改行は無視されます。

複数のステートメントは、 `; ''で区切って1行に入れることができます。 これは、パターン・アクション・ペアのアクション・パート内のステートメント(通常の場合)とパターン・アクション・ステートメント自体の両方に適用されます。

パターン

AWKパターンは、次のいずれかです。

BEGIN END / 正規表現 / 関係式 パターン && パターン パターン || パターン パターン パターン パターン パターン パターンパターン1 パターン 2

BEGINENDは、入力に対してテストされていない2つの特別な種類のパターンです。 すべてのBEGINパターンのアクション部分は、すべてのステートメントが単一のBEGINブロックに書き込まれたかのようにマージされます。 それらは、入力のいずれかが読み取られる前に実行されます。 同様に、すべてのENDブロックがマージされ、すべての入力がなくなったとき(またはexitステートメントが実行されたとき)に実行されます。 BEGINENDパターンは、パターン式の他のパタ​​ーンと組み合わせることはできません。 BEGINENDパターンには、アクション部分が欠けていることはありません。

/ 正規表現 /パターンの場合、関連するステートメントは正規表現に一致する入力レコードごとに実行されます。 正規表現はegrep (1)の正規表現と同じで、以下に要約されています。

関係式では、アクションのセクションで後述する演算子のいずれかを使用できます。 一般に、特定のフィールドが特定の正規表現と一致するかどうかをテストします。

&&|| 、そして 演算子はCのように論理AND、論理OR、論理NOTです。これらはCの場合と同様に短絡評価を行い、より基本的なパターン式を結合するために使用されます。 ほとんどの言語と同様に、カッコを使用して評価の順序を変更することができます。

?:演算子はCの同じ演算子に似ています。最初のパターンがtrueの場合、テストに使用されるパターンは2番目のパターンです。それ以外の場合は3番目のパターンです。 第2および第3のパターンのうちの1つだけが評価される。

式のpattern1 pattern2形式を範囲パターンといいます 。 これは、 pattern1と一致するレコードから始まり、 pattern2と一致するレコードまで続くすべての入力レコードに一致します。 他のパターン表現と組み合わせることはできません。

正規表現

正規表現は、 egrepにある拡張された種類です。 それらは次のような文字で構成されています。

c

非メタキャラクタcと一致します

\ c

リテラル文字cと一致します

改行を含む任意の文字にマッチします。

^

文字列の先頭に一致します。

$

文字列の終わりに一致します。

[ abc ... ]

文字リストは、 abc ...のいずれかの文字と一致します

[^ abc ... ]

否定文字リストは、 abc ...以外の任意の文字に一致します

r1 | r2

alternation: r1またはr2に一致します。

r1r2

連結: r1に一致し、 r2に一致します。

r +

1つまたは複数のrと一致します。

r *

0個以上のrと一致します。

r

ゼロまたは1つのrと一致します。

r

グループ化: rと一致します。

r { n }

r { n 、}

r { n m }中括弧の中の1つか2つの数字は区間式を表します。 中括弧に1つの数字がある場合、前の正規表現rn回繰り返されます。 カンマで区切られた2つの数字がある場合、 rnm回繰り返されます。 1つの数字の後にコンマが続く場合、 rは少なくともn回繰り返されます。

インターバル式は、コマンドラインで--posixまたは--re-intervalが指定されている場合にのみ使用できます。

\ y

単語の先頭または末尾の空の文字列と一致します。

\ B

単語内の空の文字列に一致します。

\ <

単語の先頭にある空の文字列と一致します。

\>

単語の最後にある空文字列と一致します。

\ w

単語構成文字(英字、数字、またはアンダースコア)に一致します。

\ W

単語構成要素ではない文字に一致します。

\ `

バッファ(文字列)の先頭にある空の文字列と一致します。

\ '

バッファの最後にある空の文字列と一致します。

文字列定数(下記参照)で有効なエスケープシーケンスは、正規表現でも有効です。

文字クラスは、POSIX標準で導入された新機能です。 文字クラスは、特定の属性を持つ文字のリストを記述するための特別な表記法ですが、実際の文字自体は国によって異なります。また、文字セットから文字セットまでさまざまです。 たとえば、アルファベット文字の概念は、米国とフランスでは異なります。

文字クラスは、文字リストの大カッコ内の正規表現でのみ有効です。 文字クラスは[: 、クラスを示すキーワード、および:]で構成されます。 POSIX標準で定義されている文字クラスは次のとおりです。

[:alnum:]

英数字。

[:アルファ:]

アルファベット文字。

[:ブランク:]

スペースまたはタブ文字。

[:cntrl:]

制御文字。

[:桁:]

数字。

[:グラフ:]

印刷可能で表示可能な文字。 (スペースは印刷可能ですが、表示されませんが、 aは両方です)。

[:lower:]

小文字のアルファベット文字。

[:print:]

印刷可能な文字(制御文字ではない文字)

[:punct:]

句読文字(文字、数字、制御文字、またはスペース文字ではない文字)。

[:スペース:]

スペース文字(スペース、タブ、フォームフィードなど)。

[:アッパー:]

大文字のアルファベット文字。

[:xdigit:]

16進数の文字。

たとえば、POSIX標準の前に英数字を一致させるには、 / [A-Za-z0-9] /と書かなければなりませんでした。 キャラクタセットに他のアルファベット文字が含まれていると、これは一致しません。キャラクタセットがASCIIと異なる場合は、ASCII英数字と一致しないこともあります。 POSIX文字クラスでは、 / [[:alnum:]] /と書くことができます。これは、文字セット内の英字と数字に一致します。

文字リストにはさらに2つの特別なシーケンスが表示されます。 これらは非ASCII文字セットに適用され、複数の文字で表される単一のシンボル( 照合要素と呼ばれます )と照合またはソートの目的で同等の文字がいくつかあります。 (例えば、フランス語では、「e」と「grave-accented e」は同等です。)

照合記号

照合記号は、 [。]で囲まれた複数文字の照合要素です。 たとえば、 chが照合要素である場合、 [[. ch 。]]はこの照合要素に一致する正規表現です [ch]cまたはhに一致する正規表現です。

等価クラス

等価クラスは、同等の文字のリストのロケール固有の名前です。 名前は[==]で囲まれています。 例えば、 eという名前は、 `` e ''、 `` e ''、 `` e` 'のすべてを表すために使われるかもしれません。 ee ' 、またはeのいずれかに一致します。

これらの機能は、英語以外のロケールでは非常に役立ちます。 gawkが正規表現マッチングに使用するライブラリ関数は、現在、POSIX文字クラスのみを認識します。 照合シンボルや等価クラスは認識されません。

\ y\ B\ <\>\ w\ W\\ 、および\演算子はgawkに固有です。 GNU正規表現ライブラリの機能に基づいた拡張機能です。

さまざまなコマンドラインオプションは、 gawkが正規表現内の文字をどのように解釈するかを制御します。

オプションはありません

デフォルトの場合、 gawkは上記のPOSIX正規表現とGNU正規表現演算子のすべての機能を提供します。 ただし、間隔式はサポートされていません。

--posix

POSIX正規表現だけがサポートされていますが、GNU演算子は特別ではありません。 (例えば、 \ wはリテラルwと一致します)。 区間式は使用できます。

- 従来の

伝統的なUnix awk正規表現がマッチします。 GNU演算子は特別ではなく、区間式は利用できず、どちらもPOSIX文字クラスではありません( [[:alnum:]]など)。 8進および16進のエスケープシーケンスで記述された文字は、正規表現のメタキャラクタを表していても、文字通り扱われます。

--re-interval

--traditionalが指定されていても、正規表現で区間式を許可する。

行動

アクション文は中括弧{}で囲まれています。 アクションステートメントは、ほとんどの言語で見られる通常の割り当て、条件付きステートメント、およびループステートメントから構成されます。 使用可能な演算子、制御文、および入出力文は、C言語のものよりもパターン化されています。

演算子

AWKの演算子は、優先順位の低い順に、

...

グループ化

$

フィールド参照。

++ -

接頭辞と接尾辞の両方のインクリメントとデクリメント。

^

指数演算( **も使用でき、代入演算子は** = )。

+ - !

単項プラス、単項マイナス、および論理否定。

* /%

乗算、除算、モジュラス

+ -

加減。

スペース

文字列連結。

<>

<=> =

!= ==通常の関係演算子。

〜!〜

正規表現一致、否定一致。 注: または!〜の左側に定数正規表現( / foo / )を使用しないでください。 右側のものだけを使用してください。 式/ foo / 〜expは、 (($ 0〜/ foo /) 〜exp と同じ意味を持ちます。 これは、通常意図されたものではありません

配列メンバーシップ。

&&

論理AND。

||

論理OR。

?:

Cの条件式。 これはexpr1という形式ですか? expr2 expr3expr1が真の場合、式の値はexpr2で 、それ以外の場合はexpr3です。 expr2expr3の 1つだけが評価されます。

= + = - =

* = / =%= ^ =割り当て。 絶対割り当て var = value とオペレータ割り当て(他の形式)の両方がサポートされています。

制御文

制御文は次のとおりです。

配列 内の varの ステートメント break 配列 )の ステートメント while( 条件 for( expr1 ; expr2 ; expr3 ステートメント }

I / Oステートメント

入出力文は次のとおりです。

close( file [ how ]

ファイル、パイプまたは共プロセスを閉じます。 オプションの方法は、双方向パイプの一方の端を共プロセスに閉じるときにのみ使用します。 "to"または"from"のいずれかの文字列値でなければなりません。

getline

次の入力レコードから$ 0を設定します。 NFNRFNRを設定します。

getline < ファイル

ファイルの次のレコードから$ 0を設定しますNFを設定します。

getline var

次の入力レコードからvarを設定します。 NRFNRを設定します。

getline var < file

ファイルの次のレコードからvarを設定します

コマンド | getline [ var ]

上記のように、出力を$ 0またはvarにパイプするコマンドを実行します。

コマンド |&getline [ var ]

上記のように出力を$ 0またはvarにパイプする共プロセスとしてコマンドを実行します。 共プロセスはgawkの拡張です。

現在の入力レコードの処理を停止します。 次の入力レコードが読み込まれ、AWKプログラムの最初のパターンで処理が開始されます。 入力データの終わりに達すると、 ENDブロックがあればそれが実行されます。

次のファイル

現在の入力ファイルの処理を停止します。 次の入力レコードは、次の入力ファイルから読み込まれます。 FILENAMEARGINDが更新され、 FNRが1にリセットされ、AWKプログラムの最初のパターンで処理が開始されます。 入力データの終わりに達すると、 ENDブロックがあればそれが実行されます。

印刷する

現在のレコードを印刷します。 出力レコードは、 ORS変数の値で終了します。

print expr-list

式を出力します。 各式は、 OFS変数の値で区切られます。 出力レコードは、 ORS変数の値で終了します。

print expr-list > ファイル

式をファイルに出力ます 。 各式は、 OFS変数の値で区切られます。 出力レコードは、 ORS変数の値で終了します。

printf fmt、expr-list

フォーマットと印刷。

printf fmt、expr-list > ファイル

ファイルをフォーマットして印刷します

システム( cmd-line

cmd-lineコマンドを実行し、終了ステータスを返します。 POSIX以外のシステムでは利用できないかもしれません。

fflush( [ file ]

開いている出力ファイルまたはパイプファイルに関連付けられたバッファをフラッシュしますファイルがない場合、標準出力はフラッシュされます。 fileが空文字列の場合、開いているすべての出力ファイルとパイプのバッファがフラッシュされます。

printprintfの出力リダイレクトを追加することができます。

印刷... >> ファイル

ファイルに出力を追加します

印刷する| コマンド

パイプに書き込む。

print ... |& コマンド

共プロセスにデータを送信します。

getlineコマンドは、ファイルの最後に0を返し、エラーで-1を返します。 エラーが発生すると、 ERRNOには問題を説明する文字列が含まれます。

注:ループ内でgetlineまたはprintまたはprintfからパイプまたはコプロセッサーを使用する場合close()を使用してコマンドの新しいインスタンスを作成する必要あります。 AWKは、EOFを返すときに自動的にパイプやプロセスを閉じません。

printfステートメント

printf文とsprintf()関数のAWK版(下記参照)は、次の変換指定形式を受け入れます。

%c

ASCII文字。 %cで使用された引数が数値の場合は、文字として扱われ、出力されます。 それ以外の場合、引数は文字列とみなされ、その文字列の最初の文字のみが出力されます。

%d%i

10進数(整数部分)。

%e、%E

[ - ] d.dddddde [+ - ] ddの形式の浮動小数点数。 %E形式はeの代わりにEを使用します。

%f

形式[ - ] ddd.ddddddの浮動小数点数。

%g、%G

%eまたは%f変換のどちらか短い方を使用し、有意ではないゼロを抑制します。 %G形式では、 %eの代わりに Eが使用されます。

%o

符号なし8進数(整数)。

%u符号なし10進数(ここでも整数)。

%s

文字列。

%x、%X

符号なしの16進数(整数)。 %X形式は、 abcdefの代わりにABCDEFを使用します。

%%

単一の文字。 引数は変換されません。

オプションで、追加のパラメータは、 と制御文字の間にある場合があります。

カウント $

書式設定のこの時点でcount番目の引数を使用します 。 これは位置指定子と呼ばれ、主にAWKプログラムの元のテキストではなく、翻訳された形式の文字列での使用を意図しています。 それはgawk拡張です。

-

式はそのフィールド内で左詰めにする必要があります。

スペース

数値の変換では、正の値にスペースを付け、負の値にマイナスの記号を付けます。

+

width修飾子(以下を参照)の前に使用されるプラス記号は、フォーマットされるデータが正であっても常に数値変換の記号を提供すると言います。 +はスペース修飾子をオーバーライドします。

特定の制御文字には「代替フォーム」を使用してください。 %oには、先行ゼロを指定します。 %x%Xには、0でない結果の先頭に0xまたは0Xを指定します。 %e%E 、および%fの場合、結果には常に小数点が含まれます。 %g%Gでは、末尾のゼロは結果から削除されません。

0

先頭の0 (ゼロ)はフラグとして機能し、出力にスペースの代わりに0を埋め込む必要があることを示します。 これは、数値以外の出力形式にも適用されます。 このフラグは、フィールドの幅が印刷される値よりも広い場合にのみ有効です。

フィールドはこの幅に埋め込まれている必要があります。 フィールドは通常、スペースで埋められます。 0フラグが使用された場合は、 0で埋められます。

事前

印刷時に使用する精度を指定する数値。 %e%E 、および%f形式の場合、小数点の右側に印刷する桁数を指定します。 %g形式と%G形式では、最大有効桁数を指定します。 %d%o%i%u%x 、および%Xの形式では、印刷する最小桁数を指定します。 %sの場合、文字列から印刷する最大文字数を指定します。

ANSI Cのprintf()ルーチンの動的な精度の機能がサポートされています。 widthまたはprecのいずれかの代わりにA *を指定すると、その値はprintfまたはsprintf()への引数リストから取得されます。 位置指定子を動的な幅または精度で使用するには、書式文字列の*の後にcount $を指定します。 たとえば、 「%3 $ * 2 $。* 1 $ s」と入力します。

特別なファイル名

printまたはprintfからファイルへのI / Oリダイレクションや、ファイルからのgetline経由で、 gawkは特定の特殊なファイル名を内部的に認識します。 これらのファイル名は、 gawkの親プロセス(通常はシェル)から継承されたオープンファイル記述子へのアクセスを可能にします。 これらのファイル名は、コマンドラインでデータファイルの名前を付けるために使用することもできます。 ファイル名は次のとおりです。

/ dev / stdin

標準入力。

/ dev / stdout

標準出力。

/ dev / stderr

標準エラー出力。

/ dev / fd / n

開いているファイル記述子nに関連付けられたファイル。

これらは、エラーメッセージに特に便利です。 例えば:

あなたはそれを吹き飛ばした! > "/ dev / stderr"

それ以外の場合は、

あなたはそれを吹き飛ばした! | "cat 1>&2"

TCP / IPネットワーク接続を作成するために、 |& co-process演算子とともに以下の特別なファイル名を使用することができます。

/ inet / tcp / lport / rhost / rport

ローカルポート上のTCP / IP接続用ファイルlportリモートポートrport上のリモートホストrhostへのポート。 システムにポートを選択させるには、ポート0を使用します。

/ inet / udp / lport / rhost / rport

同様ですが、TCP / IPではなくUDP / IPを使用してください。

/ inet / raw / lport / rhost / rport

将来使用するために予約されています。

他の特殊なファイル名は、実行中のgawkプロセスに関する情報にアクセスします。 これらのファイル名は廃止されました。 それらが提供する情報を取得するには、 PROCINFO配列を使用します。 ファイル名は次のとおりです。

/ dev / pid

このファイルを読むと、改行で終わっている現在のプロセスのプロセスIDが10進数で返されます。

/ dev / ppid

このファイルを読むと、現在のプロセスの親プロセスIDが改行で終わった10進数で返されます。

/ dev / pgrpid

このファイルを読むと、カレントプロセスのプロセスグループIDが改行で終わった10進数で返されます。

/ dev / user

このファイルを読むと、改行で終了した単一のレコードが返されます。 フィールドはスペースで区切られています。 $ 2はgetuid (2)システムコールの値、 $ 2getgid (2)システムコールの値、 $ 3getgid (2)システムコールの値、 $ 4getegid (2)システムコールの値です。システムコール。 追加のフィールドがある場合、それらはgetgroups (2)によって返されたグループIDです。 複数のグループがすべてのシステムでサポートされているわけではありません。

数値関数

AWKには、次の組み込み算術関数があります。

atan2( y x

ラジアン単位のy / xの逆正接を返します。

cos( expr

ラジアン単位のexprの余弦を返します。

exp( expr

指数関数です。

int( expr

整数に切り捨てます。

log( expr

自然対数関数です。

rand()

0と1の間の乱数を返します。

sin( expr

ラジアン単位のexprの正弦を返します。

sqrt( expr

平方根関数です。

srand( [ expr ]

exprを乱数ジェネレータの新しいシードとして使用します。 exprが指定されない場合は、時刻が使用されます。 戻り値は、乱数ジェネレータの以前のシードです。

文字列関数

Gawkには、次の組み込みの文字列関数があります。

アソート( s [ d ]

ソース配列s内の要素の数を返します。 sの内容は、値を比較するgawkの通常の規則を使用してソートされ、 sのソートされた値のインデックスは、1から始まる連続した整数で置き換えられます。オプションの出力配列dが指定されている場合、 sは最初にd dがソートされ、ソース配列インデックスは変更されません。

gensub( r s h [ t ]

ターゲット文字列tで正規表現rの一致を検索します。 hgまたはGで始まる文字列の場合、 rのすべての一致をsに置き換えます。 それ以外の場合、 hは、置き換えるrの一致を示す番号です。 tを指定しないと、代わりに$ 0が使用されます。 置換テキストs内では、シーケンスnnは1から9までの数字)は、 n番目のカッコで囲まれた部分式に一致するテキストだけを示すために使用できます。 シーケンス\ 0は、一致したテキスト全体を表し、 は文字です。 sub()およびgsub ()とは異なり、変更された文字列は関数の結果として返され、元のターゲット文字列は変更されません

gsub( r s [ t ]

文字列tの正規表現rに一致する各部分文字列に対して、文字列sを代入し、置換数を返します。 tを指定しない場合は、 $ 0を使用します 。 置換テキスト内のは、実際にマッチしたテキストに置き換えられます。 \を使用してリテラルを取得します。 sub()gsub() 、およびgensub()の置換テキストにおけるとバックスラッシュ規則の詳細な説明は、 GAWK:Effective AWK Programmingを参照してください。

インデックス( s t

文字列sの文字列tのインデックスを返します。tが存在しない場合は0を返します。 (これは、文字インデックスが1から始まることを意味します)。

長さ( [ s ]

文字列 sの長さ、またはsが指定されていない場合は$ 0 の長さを返します

match( s r [ a ]

正規表現rが現れるs位置を返します。rが存在しない場合は0を返し、 RSTARTRLENGTHの値を設定します。 引数の順序は、 演算子の場合と同じであることに注意してください: str〜re 。 配列aが与えられると、 aがクリアされ、要素1〜nは、 rの対応するかっこ内の部分式に一致するsの部分で埋められます。 aの0番目の要素には sの部分が正規表現r全体と一致します。

split( s a [ r ]

文字列sを正規表現rの配列aに分割し、フィールド数を返します。 rを省略すると、代わりにFSが使用されます。 配列aが最初にクリアされます。 分割は、上記のフィールド分割と同じように動作します。

sprintf( fmt expr-list

fmtに従ってexpr-listを出力し 、結果の文字列を返します。

strtonum( str

strを調べ、その数値を返します。 strが先頭の0で始まる場合、 strtonum()strが8進数であるとみなし ますstrが先頭の0xまたは0Xで始まる場合、 strtonum()strが16進数であるとみなし ます

sub( r s [ t ]

gsub()と似ていますが、最初に一致する部分文字列だけが置き換えられます。

substr( s i [ n ]

iから始まるsの最大n文字の部分文字列を返します。 nが省略された場合、残りのsが使用されます。

tolower( str

文字列strのコピーを返します。strの大文字はすべて対応する小文字に変換されます 。 アルファベット以外の文字は変更されません。

toupper( str

文字列strのコピーを返します。strのすべての小文字は対応する大文字の対応に変換されます 。 アルファベット以外の文字は変更されません。

時間関数

AWKプログラムの主な用途の1つはタイムスタンプ情報を含むログファイルの処理であるため、 gawkはタイムスタンプを取得してフォーマットするために以下の関数を提供します。

mktime( datespec

datespecをsystime ()によって返されたものと同じ形式のタイムスタンプに変換します。 datespecは、 YYYY MM DD HH MM SS [DST]という形式の文字列です。 文字列の内容は、世紀を含む通年、1から12までの月、1から31までの日、0から23までの時間、0から0までの分をそれぞれ表す6つまたは7つの数字です59、および2番目のフラグは0から60です。オプションの夏時間フラグもあります。 これらの数値の値は、指定された範囲内にある必要はありません。 たとえば、1時間は-1時を意味します。 原点ゼロのグレゴリオ暦が仮定され、年の前に0が、前に年の前に0があります。時刻はローカルのタイムゾーンにあると想定されます。 サマータイムフラグが正の場合、時刻はサマータイムとみなされます。 ゼロの場合、時間は標準時間とみなされます。 負(デフォルト)の場合、 mktime()は夏時間が指定された時間に有効かどうかを判断しようとします。 datespecに十分な要素がない場合、または結果の時間が範囲外の場合、 mktime()は-1を返します。

strftime( [ format [ timestamp ]]

指定に従ってタイムスタンプフォーマットます。 タイムスタンプは、 systime()によって返されるものと同じ形式である必要があります。 タイムスタンプがない場合、現在の時刻が使用されます。 formatが指定されていない場合は、 date (1)の出力に相当するデフォルトの書式が使用されます。 使用可能であることが保証されている形式変換については、ANSI Cのstrftime()関数の仕様を参照してください。 strftime (3)のパブリックドメイン版とそのmanページにgawkが付属しています。 そのバージョンがgawkの構築に使用された場合、そのmanページに記述されているすべての変換がgawkで利用可能です

systime()

Epoch以降の秒数(POSIXシステムでは1970-01-01 00:00:00 UTC)として現在の時刻を返します。

ビット操作関数

gawkのバージョン3.1から、以下のビット操作関数を利用できます。 これらは、倍精度浮動小数点値を符号なしlong整数に変換し、演算を行い、その結果を浮動小数点に変換することによって動作します。 関数は次のとおりです。

および( v1 v2

v1v2によって提供される値のビット単位のANDを返します。

compl( val

valのビット補数を返します。

lshift( val count

valの値をcountビットだけ左にシフトして返します。

または( v1 v2

v1v2によって提供される値のビットごとの論理和を返します。

rshift( val count

valの値をcountビットだけ右にシフトして返します。

xor( v1 v2

v1v2によって提供される値のビットごとのXORを返します。

国際化機能

gawkのバージョン3.1からは、実行時に文字列を翻訳するためにAWKプログラム内で以下の関数を使用することができます。 詳細については、 GAWK:Effective AWK Programmingを参照してください。

bindtextdomain( ディレクトリ [ domain ]

gawk.moファイルを探すディレクトリを指定します。例えば、テスト中など、 ``標準 ''の場所に置かない場合やそうでない場合があります。 これは、 ドメインが ``束縛されているディレクトリを返します。

デフォルトのドメインは、 TEXTDOMAINの値です。 directoryが空文字列( "" )の場合、 bindtextdomain()は、指定されたドメインの現在のバインディングを返します

dcgettext( string [ domain [ category ]]

ロケールカテゴリカテゴリのテキストドメインドメイン内の文字列の翻訳を返します。 domainのデフォルト値は、 TEXTDOMAINの現在の値です。 categoryのデフォルト値は"LC_MESSAGES"です。

categoryに値を指定する場合は、 GAWK:Effective AWK Programmingで説明されている既知のロケールカテゴリの1つに等しい文字列でなければなりません。 テキストドメインも指定する必要があります。 現在のドメインを使用する場合は、 TEXTDOMAINを使用します。

dcngettext( string1string2number [ domain [ category ]]

ロケールカテゴリカテゴリのテキストドメインドメインstring1string2の翻訳番号に使用される複数の形式を返しますdomainのデフォルト値は、 TEXTDOMAINの現在の値です。 categoryのデフォルト値は"LC_MESSAGES"です。

categoryに値を指定する場合は、 GAWK:Effective AWK Programmingで説明されている既知のロケールカテゴリの1つに等しい文字列でなければなりません。 テキストドメインも指定する必要があります。 現在のドメインを使用する場合は、 TEXTDOMAINを使用します。

ユーザー定義関数

AWKの関数は次のように定義されています。

関数 パラメータリスト ){ ステートメント }

関数は、パターンまたはアクションの式の中から呼び出されたときに実行されます。 関数呼び出しで提供される実際のパラメータは、関数で宣言された仮パラメータをインスタンス化するために使用されます。 配列は参照渡しであり、他の変数は値渡しです。

関数はもともとAWK言語の一部ではなかったので、ローカル変数の規定はむしろ不器用です:パラメータリストの余分なパラメータとして宣言されています。 規約は、パラメータリスト内の余分なスペースによってローカル変数を実パラメータから分離することです。 例えば:

関数f(p、q、a、b)#aとbはローカル{...} / abc / {...; f(1,2); ...}

関数呼び出しの左括弧は、関数名の直後に空白を入れずに指定する必要があります。 これは連結演算子と構文的なあいまいさを避けるためです。 この制限は、上記の組み込み関数には適用されません。

関数はお互いを呼び出すことができ、再帰的である可能性があります。 ローカル変数として使用される関数パラメータは、ヌル文字列に初期化され、関数呼び出し時にはゼロに初期化されます。

関数から値を返すには、 return exprを使用します。 値が指定されていない場合、または関数が終了時に "戻る"ことによって返される場合、戻り値は未定義です。

--lintが指定されている場合、 gawkは実行時ではなく解析時に未定義関数への呼び出しを警告します。 実行時に未定義の関数を呼び出すのは致命的なエラーです。

関数funcの代わりに関数 funcを使用することができます

ダイナミックに新しい機能を搭載

gawkのバージョン3.1から、実行中のgawkインタプリタに新しい組み込み関数を動的に追加することができます。 詳細はこのマニュアルページの範囲を超えています。 詳細については、 GAWK:Effective AWK Programmingを参照してください。

拡張( オブジェクト 関数

objectで指定された共有オブジェクトファイルを動的にリンクし、そのオブジェクトでfunctionを呼び出して、初期化を実行します。 これらは両方とも文字列として提供する必要があります。 関数が返す値を返します。

この機能はGAWKで提供され、文書化されています:効果的なAWKプログラミングですが、この機能に関するすべての内容は次のリリースで変更される可能性があります。 私たちはあなたがやり直したくないことに対してこの機能を使用しないことを強くお勧めします。

信号

pgawkは2つのシグナルを受け入れます。 SIGUSR1は、プロファイルと関数呼び出しスタックをプロファイルファイルにダンプします。これは、 awkprof.outまたは--profileオプションで指定されたファイルです。 その後、実行を続けます。 SIGHUPはプロファイルと関数呼び出しスタックをダンプしてから終了します。

使用例

すべてのユーザーのログイン名を印刷してソートする: BEGIN {FS = ":"} {print $ 1 | {print FNR、$ 0}連結と行番号(テーマのバリエーション): {print NR、 $ 0}ファイルの行数をカウントする: {nlines ++} END {print nlines} $ 0}

国際化

文字列定数は二重引用符で囲まれた文字列です。 英語以外の環境では、AWKプログラムの文字列を自然言語に変換する必要があるとマークすることができます。 このような文字列は、AWKプログラムで先頭のアンダースコア( `_ ')でマークされます。 例えば、

gawk 'BEGIN {print "hello、world"}'

こんにちは、世界を常に印刷します 。 しかし、

gawk 'BEGIN {print _ "hello、world"}'

Bonjour、フランスのmondeを印刷するかもしれない。

ローカライズ可能なAWKプログラムの作成と実行にはいくつかのステップがあります。

1。

BEGINアクションを追加してTEXTDOMAIN変数に値を割り当て、テキスト・ドメインをプログラムに関連付けられた名前に設定します。


BEGIN {TEXTDOMAIN = "myprog"}

これにより、 gawkはプログラムに関連付けられた.moファイルを見つけることができます。 この手順を行わなければ、 gawkはあなたのプログラムの翻訳を含んでいない可能性のあるメッセージテキストドメインを使います。

2。

先頭のアンダースコアで翻訳する必要があるすべての文字列をマークします。

3。

必要に応じて、プログラムのdcgettext()および/またはbindtextdomain()関数を適宜使用してください。

4。

gawk -gen-po -f myprog.awk> myprog.poを実行して、プログラムの.poファイルを生成します。

5。

適切な翻訳を提供し、対応する.moファイルをビルドしてインストールします。

国際化機能については、 GAWK:Effective AWK Programmingで詳しく説明しています。

Posixの互換性

gawkの第一の目標は、POSIX標準との互換性だけでなく、UNIX awkの最新バージョンとの互換性です。 この目的のために、 gawkは、AW​​Kの本では説明されていないが、Bell Laboratoriesのawkのバージョンの一部であり、POSIX標準に準拠している、以下のユーザ可視機能を組み込んでいます。

この本は、 awkBEGINブロックが実行された後のファイルとして引数を開くときにコマンドライン変数の代入が行われることを示しています。 しかし、初期の実装では、ファイル名の前にそのような割り当てが現れたときBEGINブロックが実行される前に割り当てが行われます。 アプリケーションがこの "機能"に依存するようになったawkがそのドキュメントに合うように変更されたとき、プログラムの実行前に変数を割り当てるための-vオプションが追加され、古い動作に依存するアプリケーションに対応しました。 (この機能はBell LaboratoriesとGNU開発者の間で合意されました)。

実装固有の機能のための-Wオプションは、POSIX標準からのものです。

引数を処理するとき、 gawkは引数の終わりを知らせるために特殊オプション `` - ''を使います。 互換モードでは、警告が表示されますが、定義されていないオプションは無視されます。 通常の操作では、そのような引数は処理するためにAWKプログラムに渡されます。

AWKの本は、 srand()の戻り値を定義していません。 POSIX標準では、使用していたシードを返すようにして、乱数列を追跡できるようにしています。 したがってgawkの srand()も現在の種を返します。

その他の新機能:MKS awkの複数の-fオプションの使用。 ENVIRON配列。 \ a\ vエスケープシーケンス( gawkで元々行われ、Bell Laboratoriesバージョンにフィードバックされています)。 tolower()およびtoupper()組み込み関数(Bell Laboratoriesのバージョンから)。 printfのANSI C変換仕様(Bell Laboratories版では最初に行われました)です。

歴史的特徴

gawkがサポートする歴史的なAWK実装の2つの機能があります。 まず、引数なしで、括弧なしでもlength()組み込み関数を呼び出すことができます! このように、

a =長さ#Holy Algol 60、Batman!

どちらかと同じです

a = length()
a =長さ($ 0)

この機能は、POSIX標準では ``非推奨 ''とマークされています。コマンドラインで--lintが指定されている場合、 gawkはその使用に関する警告を発行します。

もう1つの機能は、 whilefor 、またはdoループの本体の外側にcontinueステートメントまたはbreakステートメントを使用することです。 伝統的なAWKの実装は、 次のステートメントと同等の扱いをしています。 Gawk--traditionalが指定されている場合、この使用法をサポートしています。

GNU拡張

Gawkには、POSIX awkにいくつかの拡張機能があります。 これらは、このセクションで説明します。 --traditionalオプションを指定してgawkを呼び出すと、ここで説明しているすべての拡張機能を無効にすることができます。

gawkの以下の機能は、POSIX awkでは利用できません。

*

-fオプションで指定されたファイルのパス検索は実行されません。 したがって、 AWKPATH環境変数は特別なものではありません。

*

\ xエスケープシーケンス。 ( --posixで無効)

*

fflush()関数。 ( --posixで無効)

*

後の行を続ける能力 。 ( --posixで無効)

*

AWKプログラムの8進定数と16進定数。

*

ARGINDBINMODEERRNOLINTRTおよびTEXTDOMAIN変数は特別なものではありません。

*

IGNORECASE変数とその副作用は利用できません。

*

FIELDWIDTHS変数と固定幅フィールドの分割。

*

PROCINFO配列は使用できません。

*

正規表現としてのRSの使用。

*

I / Oリダイレクションに使用できる特殊なファイル名は認識されません。

*

コプロセスを作成するための&&演算子

*

ヌル文字列をFSの値として使用し、 split()の第3引数として個々の文字を分割する機能。

*

close()関数のオプションの2番目の引数。

*

match()関数のオプションの第3引数。

*

printfsprintf()で位置指定子を使用する能力。

*

delete 配列を使用して配列の内容全体を削除します。

*

現在の入力ファイルの処理を中止するためのnextfileの使用。

*

strftime()strtonum()systime ()strftime()strftime()strtonum()およびstrtonum ()関数とxor()関数を使用します。

*

ローカライズ可能な文字列。

*

extension()関数で新しい組み込み関数を動的に追加する。

AWKの本では、 close()関数の戻り値は定義されていません。 Gawkclose()は、それぞれ出力ファイルまたはパイプを閉じるときに、 fclose (3)またはpclose (3)から値を返します。 入力パイプを閉じるときにプロセスの終了ステータスを返します。 指定されたファイル、パイプ、または共プロセスがリダイレクションで開かれていない場合、戻り値は-1です。

gawk--traditionalオプションで呼び出されたとき、 -Fオプションへの引数fsが `` t ''なら、 FSはタブ文字に設定されます。 gawk -F \ t ...と入力すると、単にシェルが `` t ''を引用するようになり、 `` \ t ''を-Fオプションに渡さないことに注意してください。 これはかなり醜い特別なケースであるため、デフォルトの動作ではありません。 この動作は、-- posixが指定されている場合にも発生しません。 フィールド区切り文字として実際にタブ文字を取得するには、 gawk -F '\ t' ...という単一引用符を使用することをお勧めします

他のコマンドを見るwaitlpcompleteexecvgetfaclioctluniqrmmodpvcreatershunix2doscalfscdiwprivswaponautofstalkmotdatwhoiwconfigifconfigvgdisplayopenlsmodntohsmailqkillwtmp