zoukankan      html  css  js  c++  java
  • awk命令

    • awk是一种处理文本的语言,是一个强大的文本分析工具。
    • 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

    语法

    awk [选项参数] 'script' var=value file(s)
    或
    awk [选项参数] -f scriptfile var=value file(s)
    

    选项参数说明

    • -F fs or --field-separator fs
      指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

    • -v var=value or --asign var=value
      赋值一个用户定义的变量。


    awk的工作原理

    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
    
    • 第一步:执行BEGIN{ commands }语句块中的语句。
    • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
    • 第三步:当读至输入流末尾时,执行END{ commands }语句块。

    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
    pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。


    示例

    echo -e "A line 1
    A line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' 
    

    当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:

    echo | awk '{ var1="v1";var2="v2";var3="v3";print var1,var2,var3;}'
    v1 v2 v3
    

    双引号拼接使用:

    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' 
    v1=v2=v3
    

    { }类似于一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放入END语句块中。


    awk 内置变量(预定义变量)

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

    • $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。

    • $0 这个变量包含执行过程中当前行的文本内容。

    支持工具 变量名 描述
    [A] FILENAME 当前输入的文件名
    [A] FS 字段分隔符
    [A] NF 字段数,在执行过程中对应于当前的字段数
    [A] NR 记录数,执行过程中对应于当前的行号
    [A] OFMT 数字的输出格式
    [A] OFS 输出字段的分隔符
    [A] ORS 输出记录的分隔符
    [A] RS 记录分隔符
    [N] ARGC 命令行参数的数目
    [N] ARGV 包含命令行参数的数组
    [N] ERRNO 最后一个系统错误的描述
    [N] RSTART 由match函数所匹配的字符串的第一个位置
    [N] RLENGTH 由match函数所匹配的字符串的长度
    [N] SUBSEP 数组小标分隔符(默认值是34)
    [G] ARGIND 命令行中当前文本的位置(从0开始计算)
    [G] CONVFMT 数字转换格式
    [G] FIELDWIDTHS 字段宽度列表
    [G] IGNORECASE 如果为真,则进行忽略大小写的匹配
    [P] ENVIRON 环境变量关联数组
    [P] FNR 同NR,但相对于当前文件
    • 统计文件中的行数:
    awk 'END{print NR}' filename
    
    • 打印每一行的第二和第三个字段:
    awk '{ print $2,$3}' filename
    
    • 打印倒数第二个字段:
    echo -e "line1 f2 f3 
     line2 f4 f5" | awk '{print $(NF-1)}'
    
    • 一个每一行中第一个字段值累加的例子:
    seq 5 | awk 'BEGIN{ sum=0;print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum}'
    

    将外部变量值传递给awk

    • 借助-v选项,可以将外部值传递给awk:
    VAR=10000
    echo | awk -v variable=$VAR '{ print variable }'
    
    • 另一种传递外部变量的方法:
    var1="aaa"
    var2="bbb"
    echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
    
    • 当输入来自于文件时:
    awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
    

    以上方法中,变脸之间用空格分隔作为awk命令行的参数数据跟随在BEGIN、{ }和END语句块之后。


    awk运算与判断


    awk 高级输入输出

    • awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。net语句一般用于多行合并:
    cat test.txt
    a
    b
    c
    d
    e
    f
    awk 'NR%2==1{next}{print NR,$0;}' text.txt
    2 b
    4 d
    

    去重 + 唯一

    • 去重
    cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}'
    
    • 唯一
    cat tmp.log |awk '{print $15}'|awk -F'=' '{print $5}' | sort | uniq -c
    
  • 相关阅读:
    main方法为什么一定是Public static void
    DOS下编译运行小应用程序
    HelloWorld
    MySQL INFORMATION_SCHEMA 使用(转)
    MySQL int(M)的意义(转)
    Mysql 字符串类型及大小写
    使用Zookeeper 实现选主从或者分布式锁
    记一次CountDownLatch引发的问题
    Mysql恢复部分数据
    记一次Java内存性能分析
  • 原文地址:https://www.cnblogs.com/milkcoffeesugar/p/5734124.html
Copyright © 2011-2022 走看看