awk主要用于数据处理,相比于sed不同的是,sed对文件进行行的处理,awk则是通过将行进行分割来对其各字段进行处理。
awk命令里面用『‘{}’』(一对单引号再加上置于里面的一对大括号)来进行标明需要处理的字符串。
这里需要用到printf的格式化输出工具,其实这个和C里面的printf()函数用法基本一致,只是格式更加自由一点,具体的google一下。
(1)先看一个简单的用法:
$ last | grep 'Fri' | awk '{printf $1 "\t" $3}'
#这个命令是将最近一次在星期五登陆的情况显示出来,并用到了awk和printf
(2)看看几个变量:
$1 :列出每一行的帐号(位于第一列)
NR :列出目前处理的行数NF :说明该行有多少字段
FS :目前的分隔字符,默认为空格键,可通过赋值更改。
用法:
$ last | grep 'Fri' | awk '{printf $1 "\tlines"NR "\tcolumes:"NF "\n"}'
显示:fengxiaoke lines:1 columes:10
fengxiaoke lines:2 columes:9
特别提示:最后一定要加上\n,不然输出的数据会是一整行,看着真的会是MASS,不利于数据分析,失去了使用awk的意义了。
(3)获取用户ID
#打印USER和UID
$ cat /etc/passwd | awk 'BEGIN{FS=":"}$3<10{printf $1"\t"$3 “\n”}'
#加上BEGIN之后,第一个用户root将正常显示,因为FS默认从第二行开始生效
#如果我们木有加上BEGIN的话,root行会显示:
#root:x:0:0:root:/root:/bin/bash
#显然这不应该是我们想要的,所以还是得加上BEGIN
#貌似还有一个END,可以google一下
(4)进行数据的加工处理
$ cat pay.txt | awk 'NR==1{printf "\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,\ >$4,total}'NR>=2{total=$2+$3+$4 printf "\t%s\t%d\t%d\t%d\t%d\n",$1,$2,$3,\ >$4,total}
这样我们便能在原有文档的基础上得到每个人的工资总和了