awk主要用于对数据按列进行处理,而sed主要针对行进行操作,两者经常被用在shell脚本中进行数据处理


输出指定列

$1代表第一列,$NF代表最后一列,$(NF-1)即倒数第二列,print表示输出结果并换行,printf表示输出结果不换行

awk '{print $1,$NF}' test    #输出test中的第一列和最后一列(命令中的逗号将被替换为空格)


-F    用于指定分割字符

awk -F: '{print $1}' /etc/passwd    #输出/etc/passwd中的第一列,即系统中的用户名

输出结果中间可以加入自定义的字符串

[root@server7 ~]# awk -F: '{print $1,"is using " $NF,"shell"}' /etc/passwd
root is using /bin/bash shell
bin is using /sbin/nologin shell
daemon is using /sbin/nologin shell
...
...
[root@server7 ~]# awk -F: '{print $1 " is using " $NF " shell"}' /etc/passwd
#将分割用空格写到字符串中,输出结果与上一条命令一致
root is using /bin/bash shell
bin is using /sbin/nologin shell
daemon is using /sbin/nologin shell
...
...


BEGIN和END可以给首行和末行加上字符串

[root@server7 ~]# awk -F: 'BEGIN{print "User List:"} {print $1} END{print "Done!"}' /etc/passwd
User List:
root
bin
...
...
student
visitor
Done!



结合其他命令使用

[root@server7 ~]# df -hP| grep -v ^Filesystem | awk 'BEGIN{print "File system state:"}{print $1,"have",$(NF-2),"available"}END{print "Done!"}'
File system state:
/dev/mapper/vgsrv-root have 1.8G available
tmpfs have 499M available
/dev/vda1 have 172M available
/dev/mapper/vgsrv-home have 226M available
Done!


awk也可以用正则表达式进行匹配

[root@server7 ~]# awk -F: '/^[a-z]*t:/{print "Username end with \"t\" is",$1}' /etc/passwd
Username end with "t" is root
Username end with "t" is halt
Username end with "t" is rtkit
Username end with "t" is abrt
Username end with "t" is student


[root@server7 ~]# awk '/^[[:alpha:][:space:]]+$/ {print}' /usr/share/doc/zip-*/README
#筛选出只有字母和空格的行[:alpha:]表示所有字母,[:space:]表示空格
are mostly identical and there is a simple procedure to convert between the
paths and names of files in other character sets to be accurately recreated
maintains backward compatibility with older archives and is mostly compliant
and Windows and DOS users will need to either convert the files as needed to
is to use zip to convert a split archive to a single file archive and then use
the encryption code was distributed separately because of the US export
automatic notification of all postings there so try one of the other methods
   Note that the above message also may actually mean you have only part
    but are not needed on ports that do not expand file paths like
   recommend you include in your product documentation an acknowledgment
   and note that the original compression sources are available at


awk用在RH442学习时,主要用于处理sar收集来的数据

[root@server7 ~]# sar -q | awk '/^[^a-z]+$/ {print $1"\t"$3}'
#取出时间和进程数两列数据
02:20:01    225
02:30:01    225
02:40:01    225
02:50:01    223
03:00:01    223
03:10:01    224
03:20:02    224
03:30:01    226
03:36:01    228