Section Next | Prev


4.2.7 入出力

ファイルの入出力は、シェルのように負等号でリダイレクションする方法と、 明示的にファイルを open する方法があります。
また書式は C 同様 printf によって指定することが可能です。

主な入出力文
意味
printf "form",var < FILE var を書式 form で編集、ファイル(FILE)に出力
print var <<FILE var をファイル(FILE)に追加出力
print var | COMM var をパイプでコマンド(COMM)へ出力
getline < "FILE" ファイル(FILE) を open, 1行読み込む($0へ)
system("COMM") コマンド(COMM)を非同期実行

ファイルの生成(追加)
passwd(4) を読み、ユーザ名の頭文字でエントリを分割します (ファイル名は passwd.頭文字)。 なお substr() は文字列の一部を返す関数です。
	$ cat sep.awk
	{
		fname="passwd."substr($0,1,1)
		printf "%-8s %5d %5d %s\n", $1, $3, $4, $NF >> fname
	}
	$ awk -F: -f sep.awk
	$ ls passwd.?
	passwd.a   passwd.c   passwd.h   passwd.n   passwd.s   passwd.u   passwd.y
	passwd.b   passwd.d   passwd.l   passwd.r   passwd.t   passwd.w
	$ cat passwd.a
	auth         6    11
	adm         10    19 /usr/bin/ksh
	user1      666    15 /usr/local/bin/tcsh
ファイルの読み込み
次の例では、予め passwd(4) を読みとり、login,UID の連想配列を用意。 標準入力を UID として、そのユーザ名を表示します。
	$ cat uid.awk
	BEGIN{
		FS=":"	# 区切り文字をコロン(:)に
		while( getline < "/etc/passwd" ) {
			login[$3]=$1
		}
	}
	{
		printf "uid=%-5d user=%s \n", $1, login[$1]
	}
	$ awk -f uid.awk
	0
	uid=0     name=root
	10
	uid=10    name=adm
	^D

コマンド実行結果の読込み
パイプ(|)を用いると、直前に記述した文字列をコマンドとして実行し、 その結果をレコードとして入力します。
	$ cat i2f.awk
	#! /bin/gawk -f
	BEGIN{
		while( "ls -i" | getline ){
			print
			fname[$1]=$2
		}
	}
	{
		while( getline ) {
			if( $1 <=0 ) exit;
			printf "%d %s\n", $1, fname[$1]
		}
	}

	$ i2f.awk
	5518 allip	# i-node とファイル名を表示 (ls -i の結果)
	5645 bkup
	5623 box
		:
	5645	# i-node No. を入力するとファイル名が表示される
	5645 bkup
	-1	# 負の数を入力すると終了
	$

Section Next | Prev