awk相对于其它两个剑客,功能稍微强大点。其有着强大的文本格式化能力,对文本进行复杂处理,造就了它独有绝招,同时awk还是一门编程语言,支持条件判断、数组、循环等功能。

linux三剑客之awk - 图1

1、awk语法如下:

  1. awk [选项参数] '模式[动作]' 文件

这里的动作主要是指awk对文本的一些格式化处理,并且输出格式化处理后的结果,常见有print等,动作写在命令的{}里面。

1)awk常见参数有:

-F:表示指定分隔符

-v:表示定义或修改一个awk内置变量;

-f:表示从脚本中读取awk命令;

2)awk有很多内置变量,可以通过man awk查看,以下是常见的内置变量:

$0:表示完整的输入记录;

$n:表示指定分隔符后,当前指定的第n个字段;

FS:表示字段输入分隔符,默认以空格为分隔符;

OFS:表示字段输出分隔符;

NF:表示字段的个数,即以分隔符分割后,当前行一共有多少个字段;

NR:表示当前记录数,即行数;

awk涉及内容或语法比较多,想要一篇文章学完是不带现实,以下通过实例讲解它常见的那些招式,让你在日常工作中足以应付自如。

2、准备一个haotest02.txt文件,内容如下所示:

linux三剑客之awk - 图2

先执行以下awk命令,如下所示:

  1. [root@haodaolinux1 ~]# awk '{print $0}' haotest02.txt haodao1 haodao2 haodao3haodao4 haodao5 haodao6haodao7 haodao8 haodao9[root@haodaolinux1 ~]# awk '{print $1}' haotest02.txt haodao1haodao4haodao7[root@haodaolinux1 ~]# awk '{print $2}' haotest02.txt haodao2haodao5haodao8[root@haodaolinux1 ~]#

通过以上awk命令,针对动作{print $0}这里代表一整行输出,针对动作{print $1}代表第一列输出,针对动作{print $2}代表第二列输出。

awk默认是以空格符为分隔符,不管有多少个空格,也会当成一个来处理。

awk是按行处理文件的,一行处理完毕后,再处理下一行,并且是根据用户指定的分隔符去处理,没有指定分隔符的,则默认以空格来当作分隔符。

1)针对haotest02.txt文件,输出第1列,第3列的内容,命令如下所示:

  1. [root@haodaolinux1 ~]# awk '{print $1$3}' haotest02.txt haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1 $3}' haotest02.txt haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1,$3}' haotest02.txt haodao1 haodao3haodao4 haodao6haodao7 haodao9[root@haodaolinux1 ~]#

对比看出,动作中$1和$3用逗号,可以以空格输出。

可以添加自定义内容进行输出,如下命令所示:

  1. [root@haodaolinux1 ~]# awk '{print "第1列为:"$1,"第2列为:"$3}' haotest02.txt 1列为:haodao1 2列为:haodao31列为:haodao4 2列为:haodao61列为:haodao7 2列为:haodao9[root@haodaolinux1 ~]#

2)针对haotest02.txt文件,输出第1行内容,命令如下所示:

  1. [root@haodaolinux1 ~]# awk 'NR==1{print $0}' haotest02.txt haodao1 haodao2 haodao3[root@haodaolinux1 ~]#

3)针对haotest02.txt文件,输出第2行到第3行的内容,命令如下所示:

  1. [root@haodaolinux1 ~]# awk 'NR==2,NR==3{print $0}' haotest02.txt haodao4 haodao5 haodao6haodao7 haodao8 haodao9

4)针对haotest02.txt文件,输出第2行到第3行的内容,并且加上行号,命令如下所示:

  1. [root@haodaolinux1 ~]# awk 'NR==2,NR==3{print NR,$0}' haotest02.txt 2 haodao4 haodao5 haodao63 haodao7 haodao8 haodao9[root@haodaolinux1 ~]#

5)针对haotest02.txt文件,输出第1列的内容,并且显示出字段数(总列数),命令如下所示:

  1. [root@haodaolinux1 ~]# awk '{print $1,NF}' haotest02.txt haodao1 3haodao4 3haodao7 3[root@haodaolinux1 ~]#

6)针对haotest02.txt文件,输出第1列和最后一列的内容,命令如下所示:

  1. [root@haodaolinux1 ~]# awk '{print $1,$(NF)}' haotest02.txt haodao1 haodao3haodao4 haodao6haodao7 haodao9[root@haodaolinux1 ~]#

3、自定义分隔符,进行文件格式化后输出。

准备一个haotest03.txt文件,内容如下所示:

linux三剑客之awk - 图3

1)通过指定输入分隔符,如以:为输入分隔符,输出文件第一列的内容,命令如下所示:

  1. [root@haodaolinux1 ~]# awk -F ":" '{print $1}' haotest03.txt rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

或者通过修改系统默认输入分隔符变量(FS),进行输出,命令如下所示:

  1. [root@haodaolinux1 ~]# awk -v FS=':' '{print $1}' haotest03.txt rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

2)通过修改默认输出分隔符变量(OFS),输出文件第一列和最后一列内容,并且两列之间就是通过输出分隔符隔开的,命令如下所示:

  1. [root@haodaolinux1 ~]# awk -F ":" -v OFS='*****' '{print $1,$NF}' haotest03.txt root*****/bin/bashbin*****/sbin/nologindaemon*****/sbin/nologinmail*****/sbin/nologinntp*****/sbin/nologintcpdump*****/sbin/nologinhaodao2*****/bin/bashhaodao3*****/bin/bash[root@haodaolinux1 ~]#

以上就是日常工作中awk常见的用法,至于awk格式化输出还是有很多内容去学的,大家感兴趣的可以自行去了解学习。希望通过你的努力,每一天都会进步一点点。