awk是数据处理工具。相比如sed常作用于一整行的处理,awk则倾向于将一行分为数个“字段”来处理。
因此,awk适合处理小型的数据。
awk的基本模式如下:
awk '条件类型1{动作1}条件类型2{动作2}'
首先,看一段基本的代码
echo "basis exmaple pf awk" echo "**************************" echo "before awk###############" last -n 5 echo "after awk################" last -n 5 | awk '{print $1 " " $3}'
1、awk默认使用空格或者[tab]键来分隔,分别储存在$1、$2、$3。。。中,$0代表一整行
awk有一些内置变量
内置变量名称 | 代表意义 |
NF | 每一行拥有的字段总数(多少列) |
NR | 目前awk处理的是“第几行”的数据 |
FS | 目前的分隔符,默认是空格或者[Tab] |
echo " " echo " " echo "change FS" echo "**************************" cat /etc/passwd | awk '{FS=":"} $3< 10 {print $1 " " $2 " " $3}' echo " " echo "add BEGIN" cat /etc/passwd | awk ' BEGIN {FS=":"} $3< 10 {print $1 " " $2 " " $3}'
echo "add BEGIN" cat /etc/passwd | awk ' BEGIN {FS=":"} $3< 10 {print $1 " " $2 " " $3 " lines:" NR " columes" NF}'
1、执行第一个动作 {FS=":"} 将分隔符改为:
2、分隔符不会立即生效,需要到第二行才能生效,所以增加BEGIN关键词,这样第一行也能生效
echo " " echo " " echo "calculate" echo "**************************" echo -e "Name 1st 2nd 3th" > ./material/20150807awk_pay.txt echo -e "Liu 26 200 300" >> ./material/20150807awk_pay.txt echo -e "Wu 24 210 310" >> ./material/20150807awk_pay.txt echo -e "Chen 24 220 320" >> ./material/20150807awk_pay.txt echo -e "Zhong 25 230 330" >> ./material/20150807awk_pay.txt cat ./material/20150807awk_pay.txt | awk 'NR==1 {printf "%10s %10s %10s %10s %10s ",$1,$2,$3,$4,"Total"} #第一个动作 NR>=2 {total= $2 + $3 + $4 #第二个动作 printf "%10s %10d %10d %10d %10.2f ",$1,$2,$3,$4,total}'
1、echo -e " "可以将tab键打印出来,如果是 echo " ",打印出来的是 这两个字符
2、这个实例中,存在不同的判断条件,然后紧跟着对应的动作。如果需要多个命名辅助,可利用分号或者[Enter]来分隔命令
3、与bash,shell的变量不同,在awk中,变量可以直接使用(如最后一句的total),不需要加上$符号