[形式]
nawk [-F re] −f program-file [file-list]
nawk [-F re] program [file-list]
-F re : 入力区切り文字を正規表現 re とします
-f program-file : program-file で指定されたファイルを nawk に対するプ
ログラムとして実行します
file-list : nawk が対象とするファイルのリスト
program : nawk の命令からなるプログラム(文字列.「 ' 」で囲
む必要があります)
nawk のプログラムはパターンとそれに対応する動作が書かれた以下の様な行
で成り立っています.
パターン {動作}
1)パターン
パターンとしては,正規表現をスラッシュ( / )で囲んだものが使用さ
れます.この場合,入力された行の中に適合する文字列が存在すれば,
その行に対して指定された動作が実行されます.また,特定のフィール
ドやプログラムで使用している変数と,正規表現との関係を調べる関係
演算子を使用できます.関係演算しとしては以下のものを使用できます.
~,<,<=,==,!=,>=,>
なお,それらを論理演算子 ( ||, && ) で結合することも可能です.入力処理
開始時と終了時の処理を記述するために,BEGIN と END という特別なパタ
ーンが用意されています.
2)動作
パターンの適合が起こった時に行われる動作を記述します.この処理を
記述するために,以下の様な nawk 独自の組み込み変数や関数を使用でき
ます.
変数 NR : 現在処理しているレコード(行)番号
$0 : 現在処理しているレコード全体
NF : レコードに含まれているフィールドの数
$1〜#n : 各フィールドの内容
FS : 入力フィールドの区切り記号(通常,ブランク)
OFS : 出力フィールドの区切り記号(通常,ブランク)
RS : 入力レコードの区切り記号(通常,改行)
ORS : 出力レコードの区切り記号(通常,改行)
FILENAME : ファイル名
ARGC : コマンド行の引き数の数
ARGV : コマンド行の引き数配列
関数 cos(expr) : コサイン
exp(expr) : エクスポネンシャル
getline : 次の入力行を読み,$0 にセットします
getline x : 次の入力行を変数 x に読み込みます
index(s1,s2) : s1 の中の s2 の位置(存在しなければ 0 )
int(expr) : 整数部(切り捨て)
length(s) : 文字列の長さ
log(expr) : 自然対数
sin(expr) : サイン
split(s,a,c) : s を文字 c によって,a[1]...a[n] に分割し
n を返す
sprintf(fmt,...) : fmt に従って ... をフォーマットする
substr(s,m,n) : s の m 番目から n 文字文取り出す
さらに,以下の様な制御文も使用できます(複数 statement を使用する
時は,「 { 」と「 } 」を使用).
if (condition)
statement1
else
statement2
for (expresion1; condition; expresion2)
statement
while (condition)
statement
[使用例]
- 行番号と各行の内容を出力します
nawk '{print NR,$0}' test.c
- 1 と同じですが,行番号を 4 桁で出力します.
nawk '{printf"%4d %s\n",NR,$0}' test.c
- 文字列「 include 」を含んだ行を出力します
nawk '/include/{print}' test.c
- 20 文字より長い行を出力します
nawk 'length($0) > 20 {print}' test.c
- いずれも,入力区切り記号を「 / 」に変更し,パス名を除いたファイル名だけを出力します.
find . -name "*.c" -print | nawk 'BEGIN {FS="/"} {print $NF}'
find . -name "*.c" -print | nawk -F / '{print $NF}'
- ファイルをすべて読み込んだ後,逆順に出力します.
nawk ' {line[NR] = $0}\
END {for (i=NR; i>0; i--) print line[i]}' test.c
- 1 行の平均文字数を出力します.
nawk 'BEGIN {s = 0}\
{s = s + length($0)}\
END {print s/NR}' test.c
- このように長いプログラムの場合は,以下の内容
BEGIN {s = 0}
{s = s + length($0)}
END {print s/NR}
- をもつファイル temp を作成した後,
nawk -f temp test.c
- を実行しても同じ結果が得られます.
- シェルとのやり取り.例えば,「 field n m 」という n 番目と m 番目のフィールドを逆順に出力するプログラムを書きたい時は,
nawk '{print $'$2', $'$1'}'
- のようにして,1 番目および 2 番目の引き数を引き渡します.
[参照]