关于awk的用法小结

最近太忙了,所以关于shell脚本中awk的部分一直没有整理,今天碰巧在做项目的时候用到了awk,所以决定好好的整理总结一下。

  一、前言

  二、awk是什么

  三、awk的工作原理与格式介绍

  四、awk的参数格式说明

  五、总结

  一、前言

    在shell脚本里面,大体来说我们可以把所有命令拆分成两种命令,第一种命令是查询命令,比如说free,top等等,还有第二种命令就是处理命令,这里面有很多,比如我之前写过的grep,cut,sed,awk等等(反正至少目前常用的好像就这些)。不过这些命令其实有一些是重叠的,我们可以把这些命令分成两个部分,分别是按照行来进行处理,这个命令我一般用grep就够了,还有一种就是处理列的部分,这个命令目前我用awk就可以解决了。因此其实我在处理字符串的时候用grep和awk这两个命令就足够了。

  二、awk是什么

    前面提到过了,awk其实就是一种处理文本的命令,它的主要处理是按照列来进行处理文本(有很多书上把它当成一门语言来用,不过我还没有用到那么深)。

  三、awk的工作原理和格式介绍

    awk的工作原理为:按照行来进行处理,也就是说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。所以一般来说awk命令不跟循环语句连用,因为根本不需要。

    awk的格式介绍:我们从小到大来介绍awk的格式

      1、awk  +  '{action}'  + filename 这是awk中最小的格式了,前面awk表示我要执行awk命令,后面action表示我要执行的动作,filename表示我要找到的文件名。

      这里有两点要说明:1、没有+

                2、一般来说action就是print或者printf命令,到目前为止我还没用过其他的action命令。

                3、awk中必须有这三条参数,后续加的所有条件都可以没有,但唯独这三条必须有。

      2、awk + 'condition + {action}'  当我们有了action之后我们就需要执行判定条件了,这里的判定条件指的是比如我要打印多少行等等。

      3、awk + -F  + 'cutcondition'  +  ' {condition + action}'  之后我们需要拓展它的切割条件,我们默认的话切割的是空格,但是如果我们想要指定切割目标那么我们就需要这个东西了。

      4、awk + -F + 'cutcondition' + 'BEGIN{condition+action} + {condition + action}+END{condition + action}' 这是awk最全的表达式,awk支持BEGIN和END命令,这两个命令的意思是,在开始的时候先执行BEGIN中的命令,在结束的时候执行END中的命令。

    这里要说明的是:一般来说BEGIN和END只作为一些标注或者辅助作用,不作为处理文本的主要环节,处理文本还是要按照中间的部分。

  四、awk的参数格式说明

    好了,搞清楚了awk的格式,我们就来说说awk的参数格式说明,我们通过awk的格式可以看出,awk的参数主要由三部分构成,分别是cutcondition,condition和action。下面我们从前到后逐步说明一下注意事项。

  4.1 cutcondition的说明

    cutcondition,就是设置以什么方式进行切割,之前也说了,awk默认就是按照空格来进行切割的,但是在很多时候我们可能需要其他的条件进行切割,所以这就需要修改。这里的修改主要指两个方面,第一是内容的修改,第二是数量的修改

   内容的修改:例如如果我们要以:来进行分割,那么我们可以这样awk -F  '[:]'这样就可以了。

   数量的修改:例如如果我们要以:和+来进行分割,那么我们可以这样awk -F '[:+]',这样就可以了。

   这里要说明一点,就是如果以符号和空格来进行分割,如果我们携程awk  -F  '[+ ]',这样写就以+和一个空格来进行分割,这个需要我们在写之前先把文本格式排一下才可以。

  4.2 condition的说明

    condition指的是我们在使用之前需要配置的参数,比如说我们要打印多少行等等。这里一般来说我们要写两点:

    第一是行数,我们知道awk主要是处理列的,对行的处理并不擅长(其实一般来说awk和grep一块用的时候更多),但是里面还有一些简单的处理行数的办法,比如我们要打印第二行,就是'NR==2'即可。

    第二是匹配字符,比如我们要匹配root字符,我们可以这么写'/root/'即为匹配root的字符串。

  这里有一点要注意,即为如果我们想要添加多个条件,我们可以采用if语句,不过这个if语句添加稍有不同,即:

    前者:'NR==2 {action}'

    后者:'{if(NR > 1 && NR < 3) action}'

    括号的位置不同

  4.3  action

    action的话主要是用来打印的,这里要说的是打印有print和printf两种打印方法,print的格式为 print  内容,相对来说比较死板,但是用起来比较容易,而printf则比较灵活,可以指定前缀和格式,例如printf("filename is:%10s ",FILENAME),这样的形式。

   最后,awk有一个内置变量表,我直接引用了其他博客的:

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
 

  五、总结

    本文主要写了awk的用途,格式,工作场景,以及它的用法声明。当然这个东西还得多用才能理解的啦。

原文地址:https://www.cnblogs.com/songyuchen/p/13794256.html