awk(nawk)

[機能]

  ファイルの中の特定のパターンを探して処理します.以下の説明においては,nawk について説明します

[形式]
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
		
[使用例]

  1. 行番号と各行の内容を出力します
    nawk '{print NR,$0}' test.c			
  2. 1 と同じですが,行番号を 4 桁で出力します.
    nawk '{printf"%4d %s\n",NR,$0}' test.c			
  3. 文字列「 include 」を含んだ行を出力します
    nawk '/include/{print}' test.c			
  4. 20 文字より長い行を出力します
    nawk 'length($0) > 20 {print}' test.c			
  5. いずれも,入力区切り記号を「 / 」に変更し,パス名を除いたファイル名だけを出力します.
    find . -name "*.c" -print | nawk 'BEGIN {FS="/"} {print $NF}'
    find . -name "*.c" -print | nawk -F / '{print $NF}'			
  6. ファイルをすべて読み込んだ後,逆順に出力します.
    nawk ' {line[NR] = $0}\
    	END {for (i=NR; i>0; i--) print line[i]}' test.c			
  7. 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			
    を実行しても同じ結果が得られます.

  8. シェルとのやり取り.例えば,「 field n m 」という n 番目と m 番目のフィールドを逆順に出力するプログラムを書きたい時は,
    nawk '{print $'$2', $'$1'}'			
    のようにして,1 番目および 2 番目の引き数を引き渡します.

[参照]

sed

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引