过虑磁盘分区剩余空间大于200000KB 的分区,以M为单位显示 ,并留下小数点后三位
[root@fedora14 ~]# df | grep -v "Avail" | gawk '$4 > 200000 {OFMT="%.3f"; print $1,$4/1024,"M"}'
/dev/sda3 14435.445 M
tmpfs 500.699 M
/dev/sda1 248.618 M
[root@fedora14 ~]#
文件中的AWK:
[root@fedora14 ~]# cat awk1.awk
#!/bin/awk
/^Mark/ {print "Hello Mark!"}
{print $1,$3}
[root@fedora14 ~]# cat names | gawk -f awk1.awk
china 123
America 456
England 789
[root@fedora14 ~]#
printf函数修饰符
[root@fedora14 ~]# cat names
china beijing 123
America NewYork 456
England London 789
[root@fedora14 ~]# cat names | gawk '{printf("%10s %-10s %.2fn",$1,$2,$3)}'
china beijing 123.00
America NewYork 456.00
England London 789.00
[root@fedora14 ~]#
字段分隔符,字段(NF)和条目(NR)
example1:在命令行中使用 -F 定义分隔符
#[root@fedora14 ~]# cat passwd | gawk -F: ‘/root/ {print $1,$3,$7}’
root 0 /bin/bash
operator 11 /sbin/nologin
example2: 在BEGIN语句中定义分隔符
[root@fedora14 ~]# cat passwd | gawk 'BEGIN{FS=":"} /root/{print $1,$3,$7}'
root 0 /bin/bash
operator 11 /sbin/nologin
[root@fedora14 ~]#
example3:
[root@fedora14 ~]# cat names
china beijing 123
America NewYork 456
England London 789
[root@fedora14 ~]# cat names | gawk '{print NR,NF,$(NF-1)}'
1 3 beijing
2 3 NewYork
3 3 London
[root@fedora14 ~]#
example4:打印奇数行
[root@fedora14 ~]# cat passwd | gawk 'BEGIN{FS=":"} NR%2==1 {print NR,$0}'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
比较表达式
example1: 过虑在级别3、4、5都开启的服务
[root@fedora14 ~]# chkconfig | gawk '$5~/on/&&$6~/on/&&$7~/on/{print $1,"->",$5,$6,$7}'
NetworkManager -> 3:on 4:on 5:on
acpid -> 3:on 4:on 5:on
atd -> 3:on 4:on 5:on
auditd -> 3:on 4:on 5:on
avahi-daemon -> 3:on 4:on 5:on
bluetooth -> 3:on 4:on 5:on
cpuspeed -> 3:on 4:on 5:on
crond -> 3:on 4:on 5:on
.....
example2:过虑ID大于0并且小于500的帐户
[root@fedora14 ~]# cat passwd| gawk -F: '$3>0&&$3<500{print $1,$3,$7}'
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin
uucp 10 /sbin/nologin
operator 11 /sbin/nologin
模式、操作、正则表达式、匹配操作符
example1:过虑用户名只有四个字母的用户,~符号表示字段1($1)与右边的正则表达式(/^....$/)匹配
[root@bogon ~]# gawk -F: '$1~/^....$/{print $0}' passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin abrt:x:499:498::/etc/abrt:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
example2:过虑http.conf中以#开头和空白行
[root@fedora14 ~]# cat httpd.conf | gawk '$0!~/^#/&&$0!~/^ *$/{print $0}' ServerTokens OS ServerRoot "/etc/httpd" PidFile run/httpd.pid Timeout 60 KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 5
三目运算符:
example1:
[root@fedora14 ~]# cat names china beijing 123 America NewYork 456 England London 789 England London [root@fedora14 ~]# cat names | gawk '{INFO=(NF == 3)?$NF:"Error"; print INFO}' 123 456 789 Error [root@fedora14 ~]#
BEGIN模式:
example1:
[root@fedora14 ~]# cat names china beijing 123 America NewYork 456 England London 789 England London [root@fedora14 ~]# gawk 'BEGIN{OFS=":";ORS="nn";}{print $1,$2,$3}' names china:beijing:123 America:NewYork:456 England:London:789 England:London: [root@fedora14 ~]#
END模式和输出重定向:
example1:
[root@fedora14 ~]# gawk '$0~/<Direct/{print $0;count++} END{print "Total:",count}' httpd.conf <Directory /> <Directory "/var/www/html"> #<Directory /home/*/public_html> <Directory "/var/www/icons"> <Directory "/var/www/cgi-bin"> <Directory "/var/www/error"> Total: 6
example2: 追加内容到指定文件
[root@fedora14 ~]# gawk '$0~/<Direct/,$0~/</Direct/{print $0 > "./httpd.conf2";count++} END{print "Total:",count}' httpd.conf
getline:
example1:
"-"代表从管道过来的信息
[root@fedora14 ~]# ps -aux | gawk 'BEGIN{getline INFO<"-"} $1~/root/{print $0}'
example2:
当前终端输入的信息由NAME接收
[root@fedora14 ~]# gawk 'BEGIN{FS=":";getline NAME < "/dev/tty"} $1~NAME {print $3}' passwd fedora 500