经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
Linux三剑客命令—awk
来源:cnblogs  作者:JZEason  时间:2021/12/24 8:56:47  对本文有异议

一、概念说明

官方概念说明:

gawk - pattern scanning and processing language
模式扫描和处理文件语言

AWK 是一种处理文本文件的语言,主要是用来格式化文本,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

二、awk功能应用说明

  • 处理文件信息

    • 文本文件信息
    • 日志文件信息
    • 配置文件信息
  • 处理文件方式

    • 排除信息
    • 查询信息
    • 统计信息
    • 替换信息

三、awk语法原理

3.1 命令语法格式

  • 标准格式:

    1. awk [选项] '模式{动作}' [文件信息]
    2. awk [参数] [处理规则] [操作对象]
    3. 参数:
    4. -F : 指定文本分隔符(默认是以空格作为分隔符)
    5. eg:打印系统所有用户的解析器
    6. awk -F: '{print $NF}' /etc/passwd
  • 模式说明(匹配信息):

    • 普通模式(定位)

      1. 正则表达式模式

        1. eg: 打印以root开头的行
        2. [root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
      2. 比较表达式模式

        1. 相关符号:
        2. >
        3. <
        4. >=
        5. <=
        6. ~ :正则匹配
        7. !~ :正则匹配(取反)
        8. eg:要求打印属组ID大于属主ID的行
        9. [root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
        10. eg:结尾包含bash
        11. [root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
        12. eg:结尾不包含bash
        13. [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd
      3. 逻辑表达式模式

        1. 相关符号:
        2. && : 逻辑与
        3. || :逻辑或
        4. ! :逻辑非
        5. eg:要求属组 + 属主的ID 大于 2000 并且属组 * 属主的ID 大于 2000
        6. [root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
        7. eg:要求属组 + 属主的ID 大于 2000 或者属组 * 属主的ID 大于 2000
        8. [root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
        9. eg:要求属组 + 属主的ID 不大于 2000 (小于等于2000
        10. [root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
      4. 算术表达式模式

        1. 相关符号:
        2. +
        3. -
        4. *
        5. /
        6. %
        7. eg:要求属组 + 属主的ID 大于 2000
        8. [root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
        9. eg:要求属组 * 属主的ID 大于 2000
        10. [root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
        11. eg:要求打印偶数行
        12. [root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
        13. eg:要求打印奇数行
        14. [root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
      5. 条件表达式模式

        1. 相关符号:
        2. ==
        3. >
        4. <
        5. >=
        6. <=
        7. eg:要求打印第三行
        8. [root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd
      6. 范围表达式模式

        1. eg:打印以root开头到以ftp开头的行
        2. [root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd
    • 特殊模式

      • BEGIN{}

        概念说明:括号里面的内容会在awk读取文件之前执行

        1. awk 'BEGIN{print "oldboy"}{print $0}' reg.txt

        作用说明:

        1. 用于测试
        2. 用于计算
        3. 修改内置变量
      • END{}

        概念说明:括号里面的内容会在awk读取文件之后执行

        1. awk '{print $0}END{print "end of file"}' reg.txt

        作用说明:

        1. 显示计算最终结果
        2. 用于计算
  • 内置变量

    1. $0 : 代表当前行
    2. [root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
    3. $n :代表第n
    4. [root@localhost ~]# awk -F: '{print $1}' /etc/passwd
    5. NF :记录当前行的字段数(表示每一行有多少列)
    6. [root@localhost ~]# awk -F: '{print NF}' /etc/passwd
    7. [root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
    8. NR :用来表示行号信息
    9. [root@localhost ~]# awk -F: '{print NR}' /etc/passwd
    10. FS :指定文本内容分隔符(默认是空格)
    11. [root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
    12. OFS :指定打印分隔符(默认空格)
    13. [root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd

    FS 的优先级要高于 -F:-F ":" ==>BEGIN{FS=":"} ==> -vFS=":"

3.2 命令执行过程

grep、sed和awk都是读一行处理一行,直至处理完成。

awk的生命周期如下:

  1. 接收一行作为输入;
  2. 把刚刚读入进来得到的文本进行分解;
  3. 使用处理规则处理文本;
  4. 输入一行,赋值给$0,直至处理完成;
  5. 把处理完成之后的所有的数据交给END{}来再次处理;

image

四、awk实践操作

4.1 实践环境创建

  1. cat >>./reg.txt<<EOF
  2. Zhang Dandan 41117397 :250:100:175
  3. Zhang Xiaoyu 390320151 :155:90:201
  4. Meng Feixue 80042789 :250:60:50
  5. Wu Waiwai 70271111 :250:80:75
  6. Liu Bingbing 41117483 :250:100:175
  7. Wang Xiaoai 3515064655 :50:95:135
  8. Zi Gege 1986787350 :250:168:200
  9. Li Youjiu 918391635 :175:75:300
  10. Lao Nanhai 918391635 :250:100:175
  11. EOF

4.2 命令操作实践

  • 查询实践

    查找实践参数:

    1. 指定列的分隔符号(参数): -F ""
    2. 显示指定行号信息(模式): NR==
    3. 显示指定列的信息(动作): print

    案例说明:

    1. 按行查找文件数据信息:
    2. awk 'NR==1' reg.txt
    3. awk '/250/' reg.txt
    4. 按行按列查找文件信息:
    5. awk -F':' 'NR==1{print $1}' reg.txt
    6. awk -F':' 'NR==1{print $1,$2}' reg.txt
    7. awk -F':' '$3~/0+/' reg.txt

    ~ 在awk中表示匹配或者包含什么信息;

    !~ 在awk中表示不匹配或者不包含什么信息;

  • 查询测验(显示指定行的指定列的信息)

    1. 显示xiaoyu的姓氏和ID号码

      1. 条件是什么: 找出第二列包含xiaoyu的信息
      2. 动作是什么: 显示xiaoyu这行指定列信息
      3. 实践操作:
      4. awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
    2. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字

      1. 条件是什么: 找出第一列包含zhang的信息
      2. 动作是什么: 显示zhang这行指定列信息
      3. 实践操作:
      4. awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$5}' reg.txt
      5. awk -F '[ :]+' '$1~/Zhang/{print $1 $2,$(NF-1)}' reg.txt
    3. 显示所有以41开头的ID号码的人的全名和ID号码

      1. 条件是什么: 显示以41开头的ID
      2. 动作是什么: 显示41开头号码,人的全名的对应列
      3. 实践操作:
      4. awk '$3~/^41/{print $1 $2,$3}' reg.txt
    4. 显示所有ID号码最后一位数字是1或5的人的全名

      1. 条件是什么: 15结尾的ID号码
      2. 动作是什么: 显示人的全名对应列
      3. 实践操作:
      4. awk '$3~/[15]$/{print $1 $2}' reg.txt
      5. awk '$3~/(1|5)$/{print $1 $2}' reg.txt
      6. awk '$3~/1$|5$/{print $1 $2}' reg.txt
    5. 显示Xiaoyu的捐款信息,并以$开头, 如:$110$220$330

      1. 条件是什么: 找出xiaoyu的信息
      2. 动作是什么: 显示捐款信息,在数值前赋予$
      3. 实践操作:
      4. awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}' reg.txt

      gsub 是一个函数。

  • 特殊模式应用案例

    1. 统计/etc/services文件中空行数量

      1. grep应用:
      2. grep '^$' /etc/services|wc -l
      3. grep -c '^$' /etc/services
      4. awk应用:
      5. awk '/^$/{i++}END{print i}' /etc/services (表示前面先计算,最后通过END将结果进行显示)
    2. 统计/etc/passwd文件中有多少个虚拟用户

      1. awk '/nologin$/{i++}END{print i}' /etc/passwd
    3. 统计文件中的数值的和

      1. seq 10|awk '{sum=sum+$0}END{print sum}'

五、awk相关扩展

4.1 awk中的函数

  1. print : 打印
  2. printf :格式化打印
  3. %s : 字符串
  4. %d :数字
  5. - :左对齐
  6. + :右对齐
  7. 15(任意数字) : 至少占用15字符
  8. eg
  9. [root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd

4.2 awk中的流程控制(只存在循环之中)

  1. if
  2. if(){}
  3. if(){}else{}
  4. if(){}else if(){}else{}
  5. eg
  6. [root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
  7. for
  8. for(i="初始值";条件判断;游标){}
  9. eg
  10. [root@localhost ~]# awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
  11. while
  12. while(条件判断){}
  13. eg
  14. [root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd

4.3 awk数组详述

  • 数组知识学习准备

    统计计算方法说明:

    1. i=i+1
    2. 先计算右边,将右边数值给左边变量
    3. i=0 i=0+1 i=1+1 (统计次数)
    4. eg
    5. awk '/^$/{i=i+1;print i}' /etc/services
    6. awk '/^$/{i++;print i}' /etc/services
    7. i=i+$0 表示对每行的数字进行累加求和运算
    8. i=0 i=0+$0 i=$0(上一行)+$0(当前行) (求和运算)
    9. eg
    10. seq 10|awk '{sum=sum+$n;print $n,sum}'
  • 数组概念知识说明

    数组形式说明:

    1. hotel[110]="张三" :
    2. hotel 数组名称
    3. [110] 数组元素
    4. "张三" 元素内容

    数组实际应用:

    1. awk 'BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}'
    2. ...

原文链接:http://www.cnblogs.com/JZjuechen/p/15721299.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号