awk命令

作者: hugopku | 来源:发表于2014-11-30 14:47 被阅读95次

    awk是什么?

    awk - pattern-directed scanning and processing language.

    标准用法

    awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]

    参数

    -F 指定每行的分隔符
    -vprog执行之前定义一些变量
    'prog' 格式为pattern {action},pattern为匹配的模式,action为执行的操作
    -f 方便过长的awk命令书写,以及加强awk的可读性,可单独将awk命令放在一个文件中
    file 输入文件名,可以有多个

    常用内置变量

    $0 整行内容
    $1,$2... 每行的第1,2...列内容(以参数FS分隔)
    FILENAME 当前处理文件名
    NR 当前处理文件行号
    NF 当前行的列数量
    FS 分隔符
    ... ...

    用法介绍

    awk命令的用处在于扫描输入文件inputfile的每行,进行pattern匹配,每个pattern会绑定一个action,匹配的pattern就执行相应的action
    example,命令直接执行
    这应该是awk最常见的用法了,匹配以M开始的行,输出每行的第1和第3列

    localhost:~ shine$ cat inputfile 
    name    id   math computer english
    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62
    localhost:~ shine$ awk '/^M/ {print $1,$3}' inputfile 
    Marry 78
    Mike 87
    

    注意命令行中的程序是用单引号包围着的。这会防止shell解释程序中 $ 这样的字符,也允许程序的长度超过一行。

    /^m/是pattern,必须用/.../包裹正则表达式
    {print $1,$3}为action

    • 若pattern为空则每行都匹配
    • 若action为空则输出默认输出整行内容

    pattern-action对也可以有多个,如

    localhost:~ shine$ awk '/^M/ {print $1,$3} NR==1{print $1,$3}' inputfile 
    name math
    Marry 78
    Mike 87
    

    将命令放在单独文件awk.sh执行,以增强可读性
    ./awk.sh inputfile

    #!/usr/bin/awk -f
    BEGIN{
      mat=0
      eng=0
      comp=0
      FS="\t"
    }
    NR==1{
      #action部分
      mat+=$3
      eng+=$4
      comp+=$5
      if($3>80){
        print "great!"$1    
      }
      printf "%d %s %d %d %d\n",NR,$1,$3,$4,$5
    }
    
    NR==2{
      printf "hello world!"
    }
    
    END{
      print mat,eng,comp
    }
    

    执行方法
    ./awk.sh inputfile

    BEGIN

    在匹配pattern前,初始化一些变量

    END

    文件处理完成后的一些操作

    pattern-action部分

    和之前类似,用于匹配文本和操作
    其中action中可以兼容C语言的一些基本语法,如if、for、while等

    参考
    man awk
    awk简明教程

    相关文章

      网友评论

          本文标题:awk命令

          本文链接:https://www.haomeiwen.com/subject/bolgtttx.html