- 主な入出力文
| 文 |
意味 |
| 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 # 負の数を入力すると終了
$