• awk命令的使用


    1.概念:

    • awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具

    • awk是一种处理文本数据的编程语言。awk的设计使得它非常适合于处理由行和列组成的文本数据

    • awk程序可以读取文本文件,对数据进行排序,对其中的数值执行计算以及生成报表

    2.awk的工作流程:

    • awk命令的基本语法如下:

      awk 'pattern {actions}'
      参数说明
      -F指定分隔符
      -f调用脚本
      -v定义变量
      ' '中的特字符说明
      BEGIN初始化代码块
      {}命令代码块
      ;多条命令使用分号分隔
      ENDEND

    • 在上面的语法中,pattern表示匹配模式,actions表示要执行的操作

    • 当某个文本行符合pattern指定的匹配规则时,执行actions所执行的操作

    • 在上面的语法中,pattern和actions都是可选的,但是两者必须保证至少有一个。

      • 如果省略匹配模式pattern,则表示对所有的文本行执行actions所表示的操作;

      • 如果省略actions,则表示将匹配成功的行输出到屏幕。

    • 在awk处理数据时,它会反复执行以下4个步骤:

      1. 自动从指定的数据文件中读取行文本。

      2. 自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等。

      3. 依次执行程序中所有的匹配模式及其操作。

      4. 当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。

    3.awk程序执行方式:

    • 通过命令行执行awk程序,语法如下:

      awk 'program-text' [要处理的文本文件]
      例:awk '{print $0}' /etc/passwd
    • 执行awk脚本

      awk -f [脚本名] [要处理的文本文件]
    • 可执行脚本文件

      #!/bin/awk -f
      # 以上语句必须位于脚本文件的第一行。然后用户就可以通过以下命令执行awk程序:
      awk-script file
      # 其中,awk-script为awk脚本文件名称,file为要处理的文本数据文件。

    4.awk的输出:

    • print的使用格式:

      # 使用逗号隔开,表示不同内容
      # 输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
      # print命令后面的item可以省略,此时其功能相当于print $0
    • printf命令的使用格式:实现字符串的格式化

      printf(format, [arguments])
      # format是一个用来描述输出格式的字符串
      # arguments为一个参数列表,表示用来显示的数据,可以是变量名等,多个参数之间用逗号隔开
      # printf语句不会自动打印换行符
      format格式的指示符说明format格式的指示符说明
      %c显示字符的ASCII码%d, %i十进制整数
      %f显示浮点数%e, %E科学计数法显示数值
      %s显示字符串%g, %G以科学计数法的格式或浮点数的格式显示数值
      %u无符号整数%%显示%自身;
      N显示宽度-左对齐
      +显示数值符号

    • 输出重定向:

      print items > output-file
      print items >> output-file
      print items | command

    5.awk的变量:

    • awk的变量名只能包括字母、数字和下划线,并且不能以数字开头。

    • awk内置变量

      变量说明
      $0记录变量,表示当前正在处理的记录
      $n字段变量,其中n为整数,且n大于1。表示第n个字段的值
      NF整数值,表示当前记录(变量$0所代表的记录)的字段数,如:'how they are',NF=3
      NR整数值,表示awk已经读入的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数。(显示的是文件的每一行的行号)
      FNR与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;
      FILENAME表示正在处理的数据文件的名称
      FS输入字段分隔符,默认值是空格或者制表符,可使用-F指定分隔符
      OFS输出字段分隔符 ,OFS=”#”指定输出分割符为#。
      RS记录分隔符,默认值是换行符 \n
      ENVIRON当前shell环境变量及其值的关联数组;
      [root@quruixiang ~]# echo -e "1 2 3\n4 5 6" | awk '{print $0}'
      1 2 3
      4 5 6
      [root@quruixiang ~]# echo -e "1 2 3\n4 5 6" | awk '{print $1}'
      1
      4
      [root@quruixiang ~]# echo -e "1 2 3\n4 5 6" | awk '{print NF}'
      3
      3
      [root@quruixiang ~]# awk '{print FILENAME}' /etc/passwd
    • 用户自定义变量:

      • 在awk中给变量赋值使用赋值语句进行

        [root@localhost ~]# awk 'BEGIN{test="hello";print test}'
        hello
      • 在命令行中使用赋值变量

        [root@localhost ~]# awk -v test="hello" 'BEGIN {print test}'
        hello

    6.操作符:

    • awk是一种编程语言环境,因此,它也支持常用的运算符以及表达式,例如算术运算、逻辑运算以及关系运算等。

    • awk支持常用的算术运算,这一点与其他的程序设计语言基本相同。

      运算符说明举例
      +加法运算1+2表示计算1和2的和
      -减法运算82-2表示计算82和2的差
      *乘法运算2*5表示计算2和5的积
      /除法运算6/3表示计算6和2的商
      %求模运算5/2表示计算5除以2的余数
      ^指数运算2^3表示计算2的3次方
      [root@localhost ~]# awk 'BEGIN{x=2;y=3;print x**y,x^y,x*y,x/y,x+y,x-y,x%y}'
      8 8 6 0.666667 5 -1 2
      [root@localhost ~]# awk '{max=$1>$2?$1:$2;print NR,"max=",max}' file
      1 max= 6
      2 max= 10
      3 max= 3
    • 关系运算符:

      运算符说明举例
      ~匹配运算符$1 ~ /^T/表示匹配第一个字段以字符T开头的记录
      !~不匹配运算符$1 !~ /a/表示匹配第一个字段不含有字符a的记录
      [root@localhost test11]# awk '$1~/^w/ {print}' file
      wangmei 70

    7.awk的模式:

    • awk的基本语法:

      awk [options] 'PATTERN { action }' file1 file2, ...
    • 在awk中,匹配模式处于非常重要的地位,它决定着匹配模式后面的操作会影响到哪些文本行

    • awk中的匹配模式主要包括关系表达式、正则表达式、混合模式,BEGIN模式以及END模式等。

    • 关系表达式:

      [root@localhost test11]# awk '$2 > 80 {print}' file
      zhangsan 90
      lisi 81
    • 正则表达式:

      [root@localhost test11]# awk '/^l|z/{print}' file
      liming 80
      zhangsan 90
      lisi 81
    • 混合模式:

      [root@localhost test11]# awk '/^l/ && $2>80 {print}' file
      lisi 81
    • 区间模式:

      [root@localhost test11]# awk '/^liming/,$2==90 {print}' file
      liming 80
      wangmei 70
      zhangsan 90
    • BEGIN模式:

      # BEGIN模式是一种特殊的内置模式,只执行一次并且执行在主体代码块和读取数据之前
      # 可以抛开文件单独执行,结果类似于echo而END不可以
    • END模式:

      # END模式是awk的另外一种特殊模式,只执行一次并且执行在主体代码块和读取数据之后
      [root@quruixiang logs]# awk '{nums[$1]+=1;} END{for(i in nums){print nums[i],i}}' access_log

    8.awk控制语句:

    • if语句的功能是根据用户指定的条件来决定执行程序的哪个分支,其语法如下:

      if (expression) {
       statement1
       statement2
      }else{
       statement3
       statement4
      }
    • swith语句:

      swith(data){
          case value1: statement1
          case value2: statement2
          default: statement3
      }
    • while语句是另外一种常用的循环结构,其语法如下:

      [root@quruixiang ~]# echo " " | awk 'BEGIN{i=1;while(i<11){print i;i++}}'
    • awk还支持另外一种while循环语句,其语法如下:

      [root@quruixiang ~]# echo " " | awk 'BEGIN{i=1;do{print i;i++}while(i<11)}'
    • for循环语句通常用在循环次数已知的场合中,其语法如下:

      [root@quruixiang ~]# echo " " | awk 'BEGIN{for(i=1;i<11;i++){print i}}'
      # 分析httpd的access_log 1)获取访问前10位的ip地址
      awk '{nums[$1]+=1;} END{for(i in nums){print nums[i],i}}' access_log

    • break语句和continue语句

      [root@quruixiang ~]# echo "" | awk 'BEGIN{for(i=1;i<11;i++){if(i==5){continue}else{print i}}}'
    • next语句(java中的return)

      # 如果遇到next语句,则提前结束对本行文本的处理,awk会继续读取下一行数据,并且从第一个模式及其操作开始执行。
      ​
    • exit语句,exit语句的功能是终止awk程序的执行

    10.awk内置函数:

    • split(string, array [, fieldsep [, seps ] ]):

      # 将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从1开始的序列;
    • length([string])

      # 功能:返回string字符串中字符的个数;
    • substr(string, start [, length])

      # 功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;
    • system(command)

      # 功能:执行系统command并将结果返回至awk命令
    • systime()

      # 功能:取系统当前时间
    • tolower(s)

      # 功能:将s中的所有字母转为小写
    • toupper(s)

      # 功能:将s中的所有字母转为大写

    11.awk案例:

    • 获取当前内存的内存总容量

      awk '/^MemTotal:/ {print $2}' /proc/meminfo
  • 相关阅读:
    【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构
    2022年PMP考试应该注意些什么?
    某手创作服务 __NS_sig3 sig3 | js 逆向
    react+ts之router管理
    EN 14509自支撑双层金属面保温绝热夹芯板—CE认证
    c++视觉处理 ------ 反向投影图和直方图的变化
    Java面试题
    js-map方法中调用服务器接口
    《从菜鸟到大师之路 Nginx 篇》
    如何获取l2行情接口?
  • 原文地址:https://blog.csdn.net/qq_56776641/article/details/133943530