您的位置:首页 > 运维架构 > Shell

Linux学习---shell编程(08-awk)

2016-09-06 13:27 357 查看
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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: