Section Next | Prev


4.2.1 概要

awk(1) はそれだけで、言語としての機能をもつ極めて強力なツールです。 動作方法が個性的なため敬遠されがちですが、テキストのパターン・マッチングを 中心とした処理には、非常に利用しやすく設計されています。

【使い方】
	awk [-F 区ぎり記号] [-v awk変数=値] 'awkプログラム' [入力ファイル...]
	awk [-F 区ぎり記号] [-v awk変数=値] -f awkプログラム [入力ファイル...]
awk はそのスクリプトファイル(awk プログラム) を直にコマンドライン上に書く方法と 別にファイルを用意し、それを読み込ませる2通りの書き方があります。

awk プログラム
awk プログラムは凡そ以下の形式になっており、起動直後に BEGINブロックが実行され、 取り込んだファイルの各行について指定されたパターンに合致するたびに 、そのブロックが実行されます。 ファイルが終了したときに END ブロックが実行されます。
	BEGIN{
		[ アクション ]
	}
	[ /パターン/ ]{
		[ アクション ]
	}
	END{
		[ アクション ]
	}
awk は入力ファイルから指示されたパターンに一致した行に対し、そこに記述された 種々の処理(アクションと呼びます)を行い、結果を標準出力に吐き出します。
BEGIN, END は特別なパターンで、それぞれファイル open 時、EOF(End of File) 検出時にマッチします。パターンを省略すると全ての行にマッチします。
パターンには完全正規表現と、特種な変数および論理演算が利用できます。

入力した行は、区切り記号で分割し、それらを $1〜n として参照できます。 $0 は分割していない入力行全てを顕し、区切り文字の省略値は「空白かタブ」です。

awk のプリ・デファインド変数
変数名意味
FILENAME処理中のファイル名
NR処理中の行数
FNR処理中の行数(ファイル毎の)
NF処理中の項目数($1..$NF,最大99)

文法解説
awk の文法は C 言語によくにています。if, for, while などがありブロックも 括弧{} で括ります。
実数演算も可能で、組み込み関数も充実しています。 また C と違い正規表現によるパターンマッチが文字列置換ができます。

awk は常に処理対象となるファイルを読み込み、指定されたパターンを含む行を発見した時に予め指定された処理を行います。
よって awk プログラムの文法は以下のように、パターンとアクションの組合せになります。

	パターン { アクション }
	function 関数(引数..) { 文 }	... これに付いては後述
パターンには正規表現を用ることができますし、特別なパターンとしてBEGIN、ENDがあります。
BEGIN は awk がファイルを読み込む直前に適用され、ENDはファイルを全て読み終わった時に適用されます。
一般的な正規表現を用いる場合は、それらをスラッシュで囲みます
	BEGIN{ ファイルオープン時に行う処理 }
	/^#/{  先頭がシャープで始まる行に付いての処理 }
	END{ ファイル終了時に行う処理 }

awk プログラムは3種類の記述方法があります。

  1. コマンドラインに直接記述する方法
    awk '...ここにプログラムを直に記述...' データファイル
    $ awk 'BEGIN{print "length\tdata\n------\t----"}{print length($0),"\t",$0}' /etc/hosts
    length  data
    ------  ----
    25       127.0.0.1      localhost
    41       192.168.80.36  server36.abc.ne.jp        server36
    

  2. プログラムを別ファイルとして記載する方法
    プログラム部分別のファイルとすることで、 より複雑なプログラムを扱いやすく管理することができます。
    awk -f プログラムファイル データファイル
    例) (1)と同じプログラムを別ファイルとして予め作成し、実行する
    $ cat test.awk
    BEGIN{
            print "length\tdata"
            print "------\t----"
    }
    {
            print length($0),"\t",$0
    }
    $ awk -f test.awk /etc/hosts
    	# 実行結果は(1)と同じ
    

  3. 実行可能シェルスクリプトとして用意する方法
    プログラムファイルに awk の起動オプションを埋め込み、 実行権を付けることでシェルコマンドとして実行できます。
    例) (2)と同じプログラムに起動オプションを付加
    $ cat test.awk
    #! /bin/gawk -f
    BEGIN{
            print "length\tdata"
            print "------\t----"
    }
    {
            print length($0),"\t",$0
    }
    $ test.awk /etc/hosts
    	# 実行結果は(1)と同じ
    

Section Next | Prev