• Linux三剑客之awk


    组成

    awk  [options]  ‘BEGIN{  commands  }  pattern{  commands  }  END{  commands  }’ filename

      其中options表示awk的可选的命令行选项,最常用的就是-F。而后面的单引号里面的所有内容是awk的程序脚本,awk需要对文件每一行分割后的每一列做处理。filename是awk要处理的文件名

    实例:

    echo ’11 22 33 44’ | awk ‘{print $3” ”$2” ”$1}’

    输出:33 22 11

      其中省略了BEGIN块和END块,只剩下中间的程序,而且还省略了pattern部分,没有BEGIN和END表示中间的程序运行是针对所有行的。花括号里的空格必须用双引号括起来,不然输出的值会连在一起。

    echo –e ’11 22 33 44
    aa bb cc dd’ | awk ‘{print $3” ”$2” ”$1}’

    输出:

    33 22 11

    cc bb aa

    echo –e ‘1 2 3 4
    5 6 7 8’ |awk ‘$1>2{print $3” ”$2” ”$1}’

    输出:7 6 5

      其中没有省略pattern部分,这部分是条件,$1>2表示如果当前行的第一列大于2则处理当前行,否则不处理。

    echo –e ‘1 2 3 4
    5 6 7 8’ | awk ‘BEGIN{print “c1 c2 c3”;print “ ”} {print $3” ”$2” ”$1}’

    输出:

    c1 c2 c3

     

    3 2 1

    7 6 5

      其中BEGIN里的打印在开头,花括号里面可以有多条语句,使用分号隔开,print ” ”为空一行。

    echo –e ‘1
    2
    3’ | awk ‘BEGIN{print “begin”} {print $1} END{print “end”}’

    输出:

    begin

    1

    2

    3

    end

      其中END语句块是在程序处理完所有行后才执行的,且只执行一次。

    cat test.txt
    11 22 33
    23 45 34
    22 32 43
    awk ‘BEGIN{sum=0} {sum+=$1} END{print sum}’ test.txt

    输出结果:56

      其中在BEGIN中变量sum赋值为0,然后在循环语句中将每一行的第一列加到sum中,当所有的行处理完之后,打印出sum变量的值。这个例子中的BEGIN语句是可以省略的,可以直接在循环语句中使用sum变量,此时sum第一次使用,该变量会自动被建立,默认初始值为0。

    cat test.txt
    1 2 3
    4 5 6
    7 8 9
    10 11 12
    awk ‘{if($1%2==0)print $1” ”$2” ”$3}’ test.txt

    输出:

    4 5 6

    10 11 12

      其中处理第一列的值除以2余0的行。

    循环

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

    输出:

    0

    1

    2

    3

    4

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

    输出:

    0

    1

    2

    3

    4

    awk ‘BEGIN{for(count=0;count<5;cout++)print count}’

    输出:

    0

    1

    2

    3

    4

    cat test.txt
    zhangsan 2 3
    lisi 5 6
    zhangsan 8 9
    lisi 11 12
    wangwu 33 11
    awk ‘{sum[$1]+=$2}END{for(k in sum)print k” ”sum[k]}’ test.txt

    输出:

    zhangsan 10

    lisi 16

    wangwu 33

      将所有第一列相同的分成一个组,并将该组中的第二列求和。

      这个例子里面使用了for..in循环来遍历数组的key,同时通过key来得到数组的值。对于key不是数字的数组,是不能通过普通的for循环来以数字索引访问数组元素的。可以同length()函数来获取数组的元素个数。

    a=22
    b=33
    awk –v x=$a –v y=$b ‘BEGIN{print x” ”y}’

    输出:

    22 33

      其中选项-v来指定变量。只能在awk的option部分引用shell变量,在awk的语句块中使用美元符号引用变量会被awk解析成自己的变量而不是shell变量。

    操作符与优先级

    1    =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 
    2    || 
    3    &&
    4    |
    5    ^
    6    &
    7    ==,!=
    8    <=,>=,<,>
    9    <<,>>
    10    +,-
    11    *,/,%
    12    !,~
    13    -,+            正、负

    算术

    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开始

    高级用法

    说明:[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)。

    其他

    system(command) 执行系统命令,返回退出码
    mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
    strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
    systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
    根据:空格 ,来分割
    #echo “a:b c,d” | awk –F “ |,|:” ‘{print $1;print $2;print NF}’
    a
    b
    4
    
    
    #awk ‘BEGIN{a=1;b=”213”;print “output ”a”,”b;}’
    output 1,213
    
    #awk ‘BEGIN{a=1;b=”213”;print “output”,a,”,”b;}’
    output 1 ,213
    
    #awk ‘BEGIN{a=1;b=”213”;printf(“output %d,%s
    ”,a,b)}’
    output 1,213
  • 相关阅读:
    PowerShell2.0之Windows排错(六)检查网络故障
    确保数据安全是云计算取信于用户的关键
    企业发展如何借助“云的力量”
    PowerShell2.0之维护网络(三)设置网络适配器
    Feign最佳实践
    Nacos注册中心原理
    GateWay网关快速入门
    Nacos集群搭建
    Feign快速入门
    Feign的性能优化
  • 原文地址:https://www.cnblogs.com/chy-op/p/9788029.html
Copyright © 2020-2023  润新知