• linux awk详解


    awk:
      awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,
      awk在其对数据分析并生成报告时,显得尤为强大。
      简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
      awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
      awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。
      实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。
      它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

    awk工作流程:
      读入有" "换行符分割的一条记录,然后把记录按照指定的域分隔符划分域,填充域
      $0表示所有的域,$1表示第一个域,以此类推
      默认域分隔符是空白键或者tab键

      -F:指定域分隔符
      

      cat /etc/passwd | awk -F":" '{print $1}'


      中间可以用 来填充

      cat /etc/passwd | awk -F":" '{print $1"	"$7}'

    当有BEGIN,END时AWK工作流程:
      先执行begin,然后读取文件,读入有 换行符分割的第一条记录,然后安装
      指定的域分隔符划分域,填充域,$0表示所有的域,$1表示第一个域,以此类推
      随后开始执行模式所对应的动作action
      最后都执行完,最后执行end操作

      cat /etc/passwd | awk -F':' 'BEGIN {print "username bash"} {print $1","$7} END {print "run over"}'

      输出内容需要用""包含,其中BEGIN,END都是关键字,必须大写


    awk内置变量:
      awk中同样定义了很多内置变量,我们可以直接像使用普通变量一样使用他们,由于awk的版本众多,有些内置变量并不是得到所有awk版本的支持。

      说明:[A][N][P][G]表示支持该变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

      $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 
      $0 这个变量包含执行过程中当前行的文本内容。
      [N] ARGC 命令行参数的数目。
      [G] ARGIND 命令行中当前文件的位置(从0开始算)。
      [N] ARGV 包含命令行参数的数组。
      [G] CONVFMT 数字转换格式(默认值为%.6g)。
      [P] ENVIRON 环境变量关联数组。
      [N] ERRNO 最后一个系统错误的描述。
      [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
      [A] FILENAME 当前输入文件的名。
      [P] FNR 同NR,但相对于当前文件。
      [A] FS 字段分隔符(默认是任何空格)。
      [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
      [A] NF 表示字段数,在执行过程中对应于当前的字段数。
      [A] NR 表示记录数,在执行过程中对应于当前的行号。
      [A] OFMT 数字的输出格式(默认值是%.6g)。
      [A] OFS 输出字段分隔符(默认值是一个空格)。
      [A] ORS 输出记录分隔符(默认值是一个换行符)。
      [A] RS 记录分隔符(默认是一个换行符)。
      [N] RSTART 由match函数所匹配的字符串的第一个位置。
      [N] RLENGTH 由match函数所匹配的字符串的长度。
      [N] SUBSEP 数组下标分隔符(默认值是34)。




    awk编程:
      变量和赋值
        print只是语句

        awk 'BEGIN {count=0} {count++;print $0} END {print "user count is ",count}' /etc/passwd
    
        ls -l /etc/ | grep ^- | awk 'BEGIN{size=0} {size=size+$5} END{print size}'


      条件语句:

    if(expression){
    statement;
    statement;
    ......
    }
    
    
    if(expression){
    statement;
    statement;
    ......
    } else {
    statement;
    }
    
    if(expression){
    statement;
    statement;
    ......
    } else if (expression) {
    statement;
    } else {
    statement;
    }

    统计目录下文件大小,过滤掉4096(一般都是文件夹)

    ls -l | awk 'BEGIN {size=0;} {if($5!=4096){size=size+$5}} END {print "size is:",size}'


    循环语句:
      while循环

    awk 'BEGIN {count=0;while(count<5){print count;count++;}}'


      do...while循环

    awk 'BEGIN {count=0;do{print count;count++;}while(count<5)}

      for循环

    awk 'BEGIN {for(count=0; count<5; count++){print count}}'


      使用数组求和,for...in循环

    awk '{sum[$1]+=$2}END{for(k in sum){print k" "sum[k]}}'


    awk内置函数:
      算术:

        atan2(y,x) 返回 y/x 的反正切。 
        cos(x) 返回 x 的余弦;x 是弧度。 
        sin(x) 返回 x 的正弦;x 是弧度。 
        exp(x) 返回 x 幂函数。 
        log(x) 返回 x 的自然对数。 
        sqrt(x) 返回 x 平方根。 
        int(x) 返回 x 的截断至整数的值。 
        rand() 返回任意数字 n,其中 0 <= n < 1。 
        srand([expr]) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

      字符串:

        gsub(reg,str1,str2) 使用str1替换所有str2中符合正则表达式reg的子串
        sub(reg,str1,str2) 含义与gsub相同,只不过gsub是替换所有匹配,sub只替换第一个匹配
        index(str,substr) 返回substr在str中第一次出现的索引,注意索引从1开始计算,如果没有则返回0
        length(str) 返回str字符串的长度,length函数还可以返回数组元素的个数
        blength(str) 返回字符串的字节数
        match(str,reg) 与index函数一样,只不过reg使用正则表达式,例如match("hello",/lo/)
        split(str,array,reg)将str分隔成数组保存到array中,分隔使用正则reg,或者字符串都可以,返回数组长度
        tolower(str) 转换为小写
        toupper(str) 转换为大写
        substr(str,start,length) 截取字符串,从start索引开始的length个字符,如不指定length则截取到末尾,索引从1开始

      其他:

        system(command) 执行系统命令,返回退出码
        mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
        strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
        systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数


    参考:https://www.cnblogs.com/wangqiguo/p/5863266.html

  • 相关阅读:
    bzoj2791
    poi2012完成
    bzoj2795
    bzoj2790
    spring cloud 学习资源
    hystrix学习
    idea live template
    intellij-maven-imports-have-broken-classpath
    springboot elk实时日志搭建
    idea author模板
  • 原文地址:https://www.cnblogs.com/djoker/p/9408716.html
Copyright © 2020-2023  润新知