【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这个数组的下标


         👆回到顶部👆

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值