zoukankan      html  css  js  c++  java
  • 关于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的用途,格式,工作场景,以及它的用法声明。当然这个东西还得多用才能理解的啦。

  • 相关阅读:
    GOF之单例模式
    C#面向对象设计模式纵横谈课堂笔记
    Oracle事务
    Oracle游标
    pl/sql(一)
    pl/sql(二)
    pl/sql(三)
    Oracle用户管理
    Oracle视图
    Oracle函数
  • 原文地址:https://www.cnblogs.com/songyuchen/p/13794256.html
Copyright © 2011-2022 走看看