Section Next | Prev


4.2.2 1行野郎

AWK の解説書には、コマンドラインで利用できる便利で短い awk スクリプトをよく 「便利な1行野郎」とよんでいます。
ここでは入門用として優しいパターンを幾つか解説します。
cat -n と等価な awk
ファイルを表示し、その先頭に行番号を付加します。
	$ awk '{printf "%6d %s\n",NR,$0}' /etc/issue
	     1 Asianux release 1.0 (koumei)
	     2 Kernel \r on an \m
	     3 

printf は C 言語の書式に準じていて、%6d は数字を右詰め6桁で表示、%s は文字列、 \n は改行を意味しています。
変数 NR は現在処理中の行番号で、$0 は1行全てです。

また1回の処理でリセットされない FNR もあります。
	$ awk '{printf "%6d/%d %s\n",FNR,NR,$0}' /etc/hosts /etc/exports
		1/1 # Do not remove the following line, or various programs
		2/2 # that require network functionality will fail.
		3/3 127.0.0.1              localhost.localdomain localhost
		4/4 172.16.0.99            www.yakoshi.la.net h099.s19.la.net h099
		1/5 #
		2/6 /export        *(async)
		3/7 /tmp   *(rw,async)
		4/8 /mnt/nfs       172.16.0.0/255.255.0.0(rw,async)

head -5 と等価な awk
変数 NR をパターンとして評価することができます。
またアクションの省略値は print(入力行をそのまま出力)となります。
	$ awk 'NR<=5' /etc/printcap
	# /etc/printcap
	#
	# Please don't edit this file directly unless you know what you are doing!
	# Be warned that the control-panel printtool requires a very strict format!
	# Look at the printcap(5) man page for more info.
grep と等価な awk
パターンには完全正規表現が利用できるので、grep と等価な処理は簡単に行えます。
	$ grep ^[a-z] /etc/printcap
	$ awk '/^[a-z]/' /etc/printcap
	dumb|80-column dumb tty:\
	unknown|unknown terminal type:\
	lpr|printer|line printer:\
	glasstty|classic glass tty interpreting ASCII control characters:\
	vanilla:\
	ansi+local1:\
	ansi+local:\
	ansi+tabs:\
	ansi+inittabs:\
	ansi+erase:\
cut -d: -f1 と等価な awk
区切り記号を変更し、1番目の項目だけを表示、ソート(並び替え)する場合の例です。
	$ awk -F: '{print $1 | "sort"}' /etc/passwd
	adm
	apache
	bin
	canna
	daemon
	desktop
	ftp
特定の項目を指定し抽出
特定の項目についてパターンを適用することもできます。
	$ awk -F: '$4==0' /etc/passwd
	root:x:0:0:root:/root:/bin/bash
	sync:x:5:0:sync:/sbin:/bin/sync
	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
	halt:x:7:0:halt:/sbin:/sbin/halt
	operator:x:11:0:operator:/root:/sbin/nologin

この例では passwd(4) のエントリから GID が 0(root) の行を抽出しています。

Section Next | Prev