标签:
相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。 因此, awk 相当的适合处理小型的数据处理呢! awk 可以处理后续接的档案,也可以读取来自前个指令的 standard output 。
awk通常运作得模式
[root@linux ~]# awk ‘条件类型 1{动作 1} 条件类型 2{动作 2} ...‘ filename
例一:取出账号与登入者得 IP ,且账号与IP之间以[tab]隔开
[root@linux ~]# last | awk ‘{print $1 "\t" $3}‘ dmtsai 192.168.1.12 root Mon reboot boot dmtsai 192.168.1.12
awk处理流程
awk内建变量
变量名称
|
代表意义
|
NF
|
每一行 ($0) 拥有的字段总数
|
NR
|
目前 awk 所处理的是『第几行』数据
|
FS
|
目前的分隔字符,预设是空格键
|
[root@linux ~]# last | awk ‘{print $1 "\t lines: " NR "\t columes: " NF}‘ dmtsai lines: 1 columes: 10 root lines: 2 columes: 9 reboot lines: 3 columes: 9 dmtsai lines: 4 columes: 10
条件类型
awk 的逻辑运算字符
运算单元
|
代表意义
|
>
|
大于
|
<
|
小于 |
>=
|
大于或等于
|
<=
|
小于或等于
|
==
|
等于
|
!= |
不等于
|
例三:在/etc/passwd当中是以冒号":"来作为字段的分隔,那假设我要查阅,第三栏小于30以下得数据,并且仅列出账号与第三栏。
linux-xuzz:~/test # cat /etc/passwd | awk ‘{FS=":"} $3<30 {print $1 "\t " $3}‘ bin 1 daemon 2 games 12 。。。。。。
利用BEGIN关键词,可以预先设定awk的内建变量!
linux-xuzz:~/test # cat /etc/passwd | awk ‘BEGIN {FS=":"} $3<30 {print $1 "\t " $3}‘ at 25 bin 1 daemon 2 games 12
怎么样,第一行得at账户就显示出来啦,除了BEGIN之外,还有END关键字
例四:假设我有一个薪资数据表,如何帮我计算每个人的总额呢?而且我还想要格式化输出喔!
[root@linux ~]# cat pay.txt | > awk ‘NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" } NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}‘ Name 1st 2nd 3th Total VBird 23000 24000 25000 72000.00 DMTsai 21000 20000 23000 64000.00 Bird2 43000 42000 41000 126000.00
[root@linux ~]# cat pay.txt | > awk ‘{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}‘
标签:
原文地址:http://www.cnblogs.com/yanxin880526/p/4720670.html