• 专题(十四)awk


    一、背景

         awk 在 linux 服务器 上是处理 字符串的,对于 字符串中获取想要的 子字串方面是一个比较好的工具。

    二、用法

    1、选项

         

    选项 说明 备注
    -F 一行中的字符串的分割符

    不指定的时候默认是按照空格进行分割

    可以指定多个分割符

    -F '[ ,]'  表示先按照空格分割,对分割后的结果再按照 , 分割

    -v 设置变量 可以用于 '' 中
    -f    执行的 awk 脚本文件  
         
         

    awk -option '表达式',其中表达式是必填的内容,基本用法都是用 awk 进行字符串切割,获取第几列的数据,如: awk -F ':' '{print $1}' ,表示按照 : 分割每行内容,打印分割后的每行的 第一列

    2、表达式

    3、内建变量

     这里的 内建变量 主要用 在 '表达式' 中,如 ‘{print $n}’ ,展示第 n 列。

    4、AWK 脚本

    关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

    • BEGIN{ 这里面放的是执行前的语句 }
    • END {这里面放的是处理完所有的行后要执行的语句 }
    • {这里面放的是处理每一行时要执行的语句}

     1) 在 awk 命令里面直接 使用 Begin End 等

    如上图中的示例,表示: 先打印表头 + 分行符  (BEGIN{ }),然后针对每行{ }的内容进行处理

    2) 直接写一个 awk 脚本

    $ cat score.txt
    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
    $ cat cal.awk
    #!/bin/awk -f
    #运行前
    BEGIN {
        math = 0
        english = 0
        computer = 0
     
        printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    "
        printf "---------------------------------------------
    "
    }
    #运行中
    {
        math+=$3
        english+=$4
        computer+=$5
        printf "%-6s %-6s %4d %8d %8d %8d
    ", $1, $2, $3,$4,$5, $3+$4+$5
    }
    #运行后
    END {
        printf "---------------------------------------------
    "
        printf "  TOTAL:%10d %8d %8d 
    ", math, english, computer
        printf "AVERAGE:%10.2f %8.2f %8.2f
    ", math/NR, english/NR, computer/NR
    }
    $ awk -f cal.awk score.txt
    NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    ---------------------------------------------
    Marry  2143     78       84       77      239
    Jack   2321     66       78       45      189
    Tom    2122     48       77       71      196
    Mike   2537     87       97       95      279
    Bob    2415     40       57       62      159
    ---------------------------------------------
      TOTAL:       319      393      350
    AVERAGE:     63.80    78.60    70.00

    以上示例来自:https://www.runoob.com/linux/linux-comm-awk.html

    三、示例

    1、打印所有列(默认按空格分割)

    ps -ef|grep ssh |awk '{print $0}'

     2、打印最后一列(默认按空格分割)

    ps -ef|grep ssh |awk '{print $NF}'

     若想打印倒数第二列 则 为 $(NF-1) ,以此类推。

    3、按照 : 分割,打印第一列

    date |awk -F ':' '{print $1}'

     4、打印倒数第二列,按照 : 分割

    date |awk -F ':' '{print $(NF-1)}'

     5、打印多列,如打印 第2列和第3列

    date |awk -F ':' '{print $2,$3}'

     6、打印N列之后的所有列(按空格分割)

    awk '{for(i=1;i<=N;i++){$i=""}; print $0}' file

    其原理是将其前N行全部设置为空,再打印全部

    7、指定多个分割符,再按照多个分割符分割之后,打印第5列

    date |awk -F '[ :]' '{print $5}'

    示例表示:先按照空格分割,多分割后的结果再按照 : 分割,最后打印第5列

     8、显示当前的分(仅显示当前时间中的分)+10,同时显示当前的分+单位

    date |awk -F ':' -va=10 -vb=m '{print $2+a,$2b}'

    这里设置了变量 a=10,b=m;对 date 显示出的时间按照 : 进行分割,同时获取分割后的第二列也就是 分,对其进行+10操作 和 显示带单位

     9、表达式的使用

    由上可以总结出  awk option '表达式'  ,其中 '表达式' 在以上的例子上都用于 {print $N}  指定输出列了, 其实 '表达式' 可以有多种内容,并非仅仅用于指定输出列

    test.txt 文件内容为:

    1 xiaohong 33
    2 xiaoming 22
    3 tiantian 32

    1)  显示第一列中大于1的所有行

    awk '$1>1' test.txt

    表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1的所有行,由于这里在表达式中没有指定输出列,因此输出所有列

     2) 显示第一列中大于1且第三列大于30的所有行

    awk '$1>1 && $3>30' test.txt

    表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1且第三列大于30的所有行,由于这里在表达式中没有指定输出列,因此输出所有列

     3) 显示第一列中大于1且第三列大于30的所有行,但仅显示第2列

    awk '$1>1 && $3>30 {print $2}' test.txt

    表达的意思是:仍然按照空格进行分割,显示第一列的数值大于1且第三列大于30的行中的第2列

     10、内建变量的使用

    1) 指定展示第3行

    awk 'NR==3' test.txt

     表达的意思:以空格作为分割符,展示第3行的数据

  • 相关阅读:
    Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 for(;;) SimpleDateFormat("yyyy-MM-dd hh:mm:ss") equalsIgnoreCase
    Java实现随机出题,10道10以内加减法计算
    Java发出声卡蜂鸣生的方法
    Java程序调用自动关机指令 1分钟内自动关机
    Java如何将十六进制数转换为十进制数的自编程序
    告诉你今年是哪个生肖年的java程序
    更新MySQL数据库( java.sql.SQLException: No value specified for parameter 1) 异常 解决方法
    把网上图片下载到本地的java工具类
    exp ORA-01455: converting column overflows integer datatype
    shell date 格式化
  • 原文地址:https://www.cnblogs.com/sandyflower/p/15270866.html
Copyright © 2020-2023  润新知