正则四
==============================
00. 课程回顾说明
三剑客命令老二: sed
1) 概述说明
1 2 | a 擅长对行进行操作 b 擅长编辑修改文件(后向引用前向) |
2) 命令执行过程
1 2 3 | 1. 按行读取文件内容 2. 将每一行读取出来,存放模式空间 3. 检查是否匹配上了需求 |
匹配上了: 进行操作处理 增 删 改
没有匹配: 将一行内容进行默认输出,再读取下一行
PS: 不想让信息默认输出 -n 取消默认输出
4. 处理操作完成后, 会继续处理下一行
3) 命令实际操作演示
查询匹配
a 按照行号进行匹配
sed -n '3p' 文件信息
1) 进行多行匹配(连续的)
sed -n '3,5p' 文件信息
2) 进行多行匹配(不连续的)
sed -n '3p;5p' 文件信息
b 按照字符进行匹配
sed -n '/oldboy/p' 文件信息
1) 进行多行匹配(连续的)
sed -n '/oldboy/,/oldgirl/p' 文件信息
2) 进行多行匹配(不连续的)
sed -n '/oldboy/p;/oldgirl/p' 文件信息
PS: 查询信息时如果使用了正则符号,对于扩展正则符号(-r)
添加信息
a 再一行的后面进行添加信息
sed '3a oldboy' 文件信息
sed '/oldboy/a oldboy100' 文件信息
b 再一行的前面进行添加信息
sed '3i oldboy' 文件信息
sed '/oldboy/i oldboy100' 文件信息
PS: 如果想添加多行内容
sed '3a oldboy03;4a oldboy04' 文件信息 错误的
sed -e '3a oldboy03' -e '4a oldboy04' 文件信息 正确的
删除信息
按行删除数据信息
sed '3d' 文件信息
按字符信息删除数据
sed '/oldboy/d' 文件信息
PS: 此时的删除只是模拟删除, 真正删除需要使用-i参数
修改信息
a 按行整个一行内容进行修改
sed '3c oldboy01' 文件信息
b 按行一行部分内容进行修改
sed '3s#(.*)#<\1>#g' 文件信息
PS: 此时的修改只是模拟修改, 真正修改需要使用-i参数
sed命令要真正对文件进行编辑 需要使用 -i参数
使用注意事项:
a 再使用-i参数时, 请把参数放在所有参数后面使用 再-i参数后写上 .bak 继续备份
b 再使用-i参数时, 请一定不要结合-n参数一起使用
4) sed命令练习题:
1) 如何批量修改文件扩展名
2) 如何批量创建用户并设置随机密码
01. 企业需求测验:
1) 如何取出IP地址信息(grep sed)
方法一: 利用sed
第一个历程: 如何获得IP地址
ip address show eth0
第二个历程: 将IP地址所在的行过滤出来
ip address show eth0|sed -n '3p'
第三个历程: 将一行中没有的信息进行删除
1 | ip address show eth0| sed -n '3p' | sed -r 's#^.*net (.*)#\1#g' | sed -r 's#(.*)/24.*$#\1#g' |
截取IP地址前的信息 截取IP地址后的信息
命令优化
1 | ip address show eth0| sed -n '3p' | sed -r 's#^.*net (.*)/24.*$#\1#g' |
终极优化
1 2 3 4 | ip address show eth0| sed -nr '3s#^.*net (.*)/24.*$#\1#gp' sed -n '3 p' sed -r 's#^.*net (.*)/24.*$#\1#g' sed -nr '3s#^.*net (.*)/24.*$#\1#gp' |
方法二: 利用grep
第一个历程: 如何获得IP地址
ip address show eth0
第二个历程: 将IP地址所在的行过滤出来
ip address show eth0|grep "inet "
第三个历程: 取出IP地址信息
1 | ip address show eth0| grep "inet " | grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" |
命令优化
1 | ip address show eth0| grep "inet " | grep -E "([0-9]+\.){3}[0-9]+" |
终极优化
1 2 | ip address show eth0| grep "inet " | grep -E "([0-9]+\.?){3}" ip address show eth0| grep "inet " | grep -E "([0-9]+\.?){4}" -o| head -1 |
方法三: 利用awk取出IP地址
02. 三剑客命令-老大 awk
概念说明:
a 擅长对列进行操作处理
b 擅长对文件数据进行分析统计
03. awk命令操作处理文件内容的方法
1) 查询操作
2) 排除操作
3) 替换操作
4) 统计操作
04. awk命令格式与操作原理
命令格式:
sed [参数] '指令信息' 文件信息
awk [选项] '模式{动作}' [文件信息]
模式: 匹配的条件 /oldboy/
05. awk实践操作过程:
生成模拟环境
cat >> ~/reg.txt<<EOF Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75 Liu Bingbing 41117483 :250:100:175 Wang Xiaoai 3515064655 :50:95:135 Zi Gege 1986787350 :250:168:200 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:100:175 EOF
采取测验完成需求的方式
01. 显示xiaoyu的姓氏和ID号码
第一历程: 根据需求找到符合条件的信息
按行查找
awk 'NR==2' ~/reg.txt [root@oldboy-xiaodao.com.cn ~]# awk 'NR==2' ~/reg.txt Zhang Xiaoyu 390320151 :155:90:201 [root@oldboy-xiaodao.com.cn ~]# awk 'NR==2{print $0}' ~/reg.txt Zhang Xiaoyu 390320151 :155:90:201
字符查找
~ 表示按列进行匹配
!~ 表示案列进行排除匹配
awk '/Xiaoyu/' ~/reg.txt 错误
awk '$2~/Xiaoyu/' ~/reg.txt 按列匹配
第二历程: 满足条件的信息进行处理
[root@oldboy-xiaodao.com.cn ~]# awk 'NR==2{print $1,$3}' ~/reg.txt Zhang 390320151 [root@oldboy-xiaodao.com.cn ~]# awk 'NR==2{print $1" "$3}' ~/reg.txt Zhang 390320151 [root@oldboy-xiaodao.com.cn ~]# awk '$2~/Xiaoyu/{print $1" "$3}' ~/reg.txt Zhang 390320151
02. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字
第一历程: 根据需求找到符合条件的信息
字符查找
[root@oldboy-xiaodao.com.cn ~]# awk '$1~/Zhang/' reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 [root@oldboy-xiaodao.com.cn ~]# awk '/^Zhang/' reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201
第二历程: 满足条件的信息进行处理
1 2 3 | [root@oldboy-xiaodao.com.cn ~] # awk '/^Zhang/{print $2,$4}' reg.txt Dandan :250:100:175 Xiaoyu :155:90:201 |
无法取出第4列中的部分内容
[root@oldboy-xiaodao.com.cn ~]# awk -F "[ :]+" '/^Zhang/{print $2,$5}' reg.txt Dandan 100 Xiaoyu 90 [root@oldboy-xiaodao.com.cn ~]# awk -F "[ :]+" '/^Zhang/{print $2,$(NF-1)}' reg.txt Dandan 100 Xiaoyu 90
awk参数说明:
-F 用于指定awk切割列的条件信息
利用[]+ 可以将连续多个切割字符整合为一个整体
03. 显示所有以41开头的ID号码的人的全名和ID号码
第一历程: 根据需求找到符合条件的信息
1 2 3 | [root@oldboy-xiaodao.com.cn ~] # awk '$3~/^41/' reg.txt Zhang Dandan 41117397 :250:100:175 Liu Bingbing 41117483 :250:100:175 |
第二历程: 满足条件的信息进行处理
1 2 3 | [root@oldboy-xiaodao.com.cn ~] # awk '$3~/^41/{print $1,$2,$3}' reg.txt Zhang Dandan 41117397 Liu Bingbing 41117483 |
04. 显示所有ID号码最后一位数字是1或5的人的全名
第一历程: 根据需求找到符合条件的信息
[root@oldboy-xiaodao.com.cn ~]# awk '$3~/[15]$/' reg.txt Zhang Xiaoyu 390320151 :155:90:201 Wu Waiwai 70271111 :250:80:75 Wang Xiaoai 3515064655 :50:95:135 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:100:175
第二历程: 满足条件的信息进行处理
[root@oldboy-xiaodao.com.cn ~]# awk '$3~/[15]$/{print $1,$2}' reg.txt Zhang Xiaoyu Wu Waiwai Wang Xiaoai Li Youjiu Lao Nanhai
05. 显示Xiaoyu的捐款,每个时都有以开头,如110220330
第一历程: 根据需求找到符合条件的信息
1 2 | [root@oldboy-xiaodao.com.cn ~] # awk '$2~/Xiaoyu/' reg.txt Zhang Xiaoyu 390320151 :155:90:201 |
第二历程: 满足条件的信息进行处理
[root@oldboy-xiaodao.com.cn ~]# awk '$2~/Xiaoyu/{print $4}' reg.txt :155:90:201 [root@oldboy-xiaodao.com.cn ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt $155$90$201
awk替换测试命令
[root@oldboy-xiaodao.com.cn ~]# echo :155:90:201|awk '{gsub(/:/,"$",$1);print $1}' $155$90$201
补充: awk替换信息语法格式
awk '{gsub(//,"",n);printn}'
/要替换修改的信息/,'修改成什么信息',需要修改的列的信息
/:/,"$",
06. awk特殊模式说明
BEGIN{}
1) 再操作文件之前,执行相应操作动作
实际应用: 输出每列的表头信息
2) 可以进行运算
[root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3+2}' 5 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3-2}' 1 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3*2}' 6 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3/2}' 1.5 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3^2}' 9 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 3%2}' 1 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 5%3}' 2 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 5**3}' 125 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 2**3}' 8 [root@oldboy-xiaodao.com.cn ~]# awk 'BEGIN{print 2^3}' 8
3) 修饰内置变量???
END{}
1) 再操作文件之后,执行相应操作动作
实际应用: 用于输出最终结果信息???
07. awk对数据文件信息分析处理练习
1) 统计/etc/services文件中空行数量
第一个历程: 如何进行累加运算
说明:
1 2 3 4 | a awk - v 参数可以设置变量 c awk 调取变量不需要加上$ d awk 默认会将字符当成变量进行调取 如果不想被识别为变量需要加上双引号 e awk 进行累加运算的公式 i=i+1 |
第二个历程: 将空号找出来,进行累加运算
[root@oldboy-xiaodao.com.cn ~]# awk '/^$/{i=i+1;print i}' /etc/services 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
只想看最终结果
1 2 | [root@oldboy-xiaodao.com.cn ~] # awk '/^$/{i=i+1}END{print i}' /etc/services 17 |
02. 统计/etc/passwd文件中有多少个虚拟用户
统计文件中所有以nologin结尾的行,总计有多少
1 2 3 4 | [root@oldboy-xiaodao.com.cn ~] # awk '/nologin$/{i=i+1}END{print i}' /etc/passwd 18 [root@oldboy-xiaodao.com.cn ~] # awk '/nologin$/{i++}END{print i}' /etc/passwd 18 |
03. 直接完成求和运算
[root@oldboy-xiaodao.com.cn ~]# seq 10 1 2 3 4 5 6 7 8 9 10 [root@oldboy-xiaodao.com.cn ~]# seq 10|awk '{i=i+$1;print i}' 1 3 6 10 15 21 28 36 45 55 [root@oldboy-xiaodao.com.cn ~]# seq 10|awk '{i=i+$1}END{print i}' 55 [root@oldboy-xiaodao.com.cn ~]# seq 10|awk '{i+=$1}END{print i}' 55
作业:
01. 根据secure文件, 如果统计出哪个IP地址失败次数最多
显示失败的IP地址 显示失败了多少次
按顺序显示前10名
(awk 数组)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· Ollama系列05:Ollama API 使用指南
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率