• 【Shell篇<Ⅴ>】——三剑客之awk


    让我们进入今天的学习吧!
    💪Keep  trying💪

    在这里插入图片描述

    一、awk基本使用

    1、AWK可以实现精确地搜索并输出结果,对文本逐行进行处理

    • 使用格式
      awk [选项] ‘[条件]{指令}’ 被处理文档
      例如:输出文件的第一列和第三列
    [root@tomcat test]# awk  '{print $1, $3}' ps.txt
    

    2、指定分隔符

    • -F选项可以指定文本以什么为分隔符,默认是空格
      例如:指定冒号为分隔符
    [root@tomcat test]# awk -F: '{print $1, $3}' ps.txt
    

    3、内置变量

    • $1:第一列的内容,依次类推,$10:第十列的内容
    • $0:所有列的内容
    • NR:代表行号
    • NF:代表列号,$NF就会取到每行的最后一列的内容
    • 注意:内置变量必须放在{}里面,print后面使用,也可以配合条件中的 ~ 和 !~ 一起使用
      例如:
    # 打印所有的行号
    [root@tomcat test]# awk -F: '{print NR}' ps.txt 
    # 打印每一行所有的列号
    [root@tomcat test]# awk -F: '{print NF}' ps.txt 
    # 打印第五行第五列的元素
    [root@tomcat test]# awk -F: 'NR==5{print $5}' ps.txt 
    

    4、输出常量

    • 如果想要输出常量,将常量用双引号引起来即可。如果想要输出空格,可以在两个常量间用逗号隔开算一个,或者在双引号里面直接空格。
    [root@tomcat test]# awk '{print "haha", "xixi"}' ps.txt
    haha xixi
    haha xixi
    

    二、awk条件

    • /字符串/:字符串里面可加正则表达式
      可以配合 ~ 和 !~ 一起使用,~ 代表包含,!~ 代表不包含
      注意:~ 和 !~ 其实也像运算符,格式为 a~b,也需要a和b两个操作数
    # 以root开头的行
    [root@tomcat test]# awk -F: '/^root/{print}' ps.txt
    root:x:0:0:root:/root:/bin/bash
    # 第一个字段不以root开头
    [root@tomcat test]# awk -F: '$1!~/^root/{print}' ps.txt
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    • 使用数字和字符串
      可用 ==,!=,>,>=,<,<= 来进行判断
    # 输出第二行的数据
    [root@tomcat test]# awk -F: 'NR==2{print}' ps.txt
    bin:x:1:1:bin:/bin:/sbin/nologin
    # 输出每行超过5列的数据
    [root@tomcat test]# awk -F: 'NF>5{print}' ps.txt
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    
    • 逻辑组合
      || 和 &&,与和或,可以配合上面的条件使用
    #列出uid小于等于2的用户
    [root@tomcat test]# awk -F: '$3>=0 && $3<=2{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    #列出uid为1或7的用户
    [root@tomcat test]# awk -F: '$3==1 || $3==7{print}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    
    • 运算
      支持 +,-,*,/,%,+=,-=,*=,/=
    # 输出奇数行
    [root@tomcat test]# awk -F: 'NR%2==1{print}' ps.txt
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    

    三、awk处理时机

    • BEGIN{}:执行一次,读取文档之前执行,一般用来初始化操作
    • {}:逐行读入文档,执行想要的操作
    • END{}:执行一次,逐行任务完成后执行,一般用来输出结果
    • 例如
    # 预处理任务不需要文件,多任务用分号隔开
    [root@tomcat test]# awk 'BEGIN{a=10;print a+=10}'
    20
    # 统计使用bash的用户数量
    [root@tomcat test]# awk -F: 'BEGIN{x=0} /bash$/{x++} END{print x}' /etc/passwd
    2
    

    四、awk数组

    • 定义数组
      数组名[下标]=元素值
    • 调用数组
      数组名[下标]
    • 遍历数组
      for(变量 in 数组名){任务}
    • 例子
    # 定义数组
    [root@tomcat test]# awk  'BEGIN{a[0]=1;a[1]=2;print a[0],a[1]}'
    1 2
    
    • 排序
      sort命令
      常用选项:
      • -n: 按数字排序
      • -k: 指定按第几列排
      • -r: 按降序排(默认升序)
    • 案例
      针对web访问日志,计算web访问的排名,格式为:ip:次数
      解析:用逐行任务定义数组并把ip作为下标进行累加,用end任务进行输出
    [root@tomcat test]# awk '{ip[$1]++} END{for(i in ip){print i,ip[i]}}' /etc/httpd/logs/access_log | sort -nr -k 2
    192.168.88.88 5
    192.168.88.80 1
    ::1 1
    

    注意:在end任务重,i会拿到ip这个数组的下标


             👆回到顶部👆

    在这里插入图片描述

  • 相关阅读:
    矩阵求导简记
    刚装的vm虚拟机的 ubuntu要装很多东西
    各位大佬,有什么办法能过滤掉箭头所示的标签呢
    如何看待现在的面试变成了八股文
    IDEA 使用自定义MAVEN(maven安装及IDEA配置)
    Go Web——简单blog项目(一)
    VPS2104 小功率反激电源控制器 4-100VIN/120V/4A 功率管
    qt day
    软件设计模式白话文系列(八)桥接模式
    vite2 + vue3 使用svg图标
  • 原文地址:https://blog.csdn.net/qq_41890240/article/details/126953651