awk ‘条件1{动作1}条件2{动作2}…’ 文件名
条件(Pattern):
一般适用关系表达式作为条件
动作(Action):
格式化输出
流程控制语句
simin@iZ25c6i87bkZ:~$ cat test ID Name Age 1 HanMei 21 2 LiLei 22 3 Simin 23 simin@iZ25c6i87bkZ:~$ awk '{printf $1"\t"$3"\n"}' test ID Age 1 21 2 22 3 23 simin@iZ25c6i87bkZ:~$ #awk会把文件中的内容按行输入,然后处理 |
simin@iZ25c6i87bkZ:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 59G 3.2G 53G 6% / none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 3.9G 4.0K 3.9G 1% /dev tmpfs 799M 388K 799M 1% /run none 5.0M 0 5.0M 0% /run/lock none 3.9G 0 3.9G 0% /run/shm none 100M 0 100M 0% /run/user simin@iZ25c6i87bkZ:~$ df -h|awk '{printf $1"\t" $5"%\n"}' #注意:ubuntu中要加%,否则系统会认为内容中的%是命令的一部分,centos中不用加% Filesystem Use% /dev/xvda1 6% none 0% udev 1% tmpfs 1% none 0% none 0% none 0%s simin@iZ25c6i87bkZ:~$ |
simin@iZ25c6i87bkZ:~$ df -h|grep /dev/xvda1 |awk '{printf $5"%\n"}' |cut -d "%" -f 1 6 #这样就可以获得/dev/xvda1分区的使用率了 |
BEGIN关键字
在所有数据提取之前,执行BEGIN后的动作
simin@iZ25c6i87bkZ:~$ awk 'BEGIN{printf "开始啦\n"}{printf $1"\t" $3"\n"}' test 开始啦 ID Age 1 21 2 22 3 23 |
它的作用是啥呢
FS内置变量,用于指定分隔符
simin@iZ25c6i87bkZ:~$ awk '{FS=":"}{printf $1"\t" $3"\n"}' /etc/passwd root:x:0:0:root:/root:/bin/bash # 看下面注释 daemon 1 bin 2 sys 3 mail 8 。。。 。。。 oxxxx2 1000 simin 1001
|
注释:第一行没有处理,因为awk执行时先读入第一行数据,在执行动作,所以{FS=”:”}指定分隔符的动作在读取第一行数据之后执行,所以第一行只能按照默认分隔符空格分割
simin@iZ25c6i87bkZ:~$ awk 'BEGIN{FS=":"}{printf $1"\t" $3"\n"}' /etc/passwd root 0 bin 2 sys 3 mail 8 。。。 oxxxx2 1000 simin 1001 |
用BEGIN指定在读取第一条数据之前,就执行后面的动作{FS=”:”}来指定分隔符,然后才会读取数据
END关键字
所有数据都处理完之后,执行END后的动作
Finishedsimin@iZ25c6i87bkZ:~$ awk 'BEGIN{FS=":"}END{printf"Finished\n"}{printf $1"\t" $3"\n"}' /etc/passwd root 0 bin 2 sys 3 mail 8 news 9 。。。 oxxxx2 1000 simin 1001 Finished |
条件判断
simin@iZ25c6i87bkZ:~$ awk 'BEGIN{FS=":"}$3>10{printf $1"\t" $3"\n"}' /etc/passwd proxy 13 www-data 33 backup 34 list 38 irc 39 gnats 41 nobody 65534 libuuid 100 syslog 101 messagebus 102 ntp 103 sshd 104 oxxxx2 1000 simin 1001 |