第十一章 正则表达式(bash对文本的处理)
1. Bash中常用正则表达式
^行首标识符 ^str => 以str开头的行 $行尾标识符 str$ => 以str结尾的行 ^$ => 空白行 \ 转义字符 数量标识符 * => 个数>=0 + => 个数>=1 ? => 个数 in [0,1] \{x,y\} => 个数 [x,y] 逻辑标识符 |或 字符串表示符 ()
2. grep-bash中的like
作用: 根据指定规则扫描文件,并打印符合规则的行 格式: grep -参数 'str' [stdin|file](多个文件空格分隔) 参数: -v 反向匹配 打印没有匹配到指定字符串的行 -n 输出的同时打印行号 -i 忽略大小写 -c 只打印包含指定内容行的行数 -r 指定查找的是目录,会将该目录下所有的文件都作为查询对象 -E 相当于egrep 可以使用 逻辑标识符、数量标识符 示例: 1.查询指定目录下中文件包含某个字符串的文件 [root@gaocun user]# grep -r '[123]' ./ ./demo:1 ./demo:2 2.定位空白行 [root@gaocun user]# grep -n '^$' demo 11: 12:
3. egrep(延伸正则表达式)、grep -E、grep的区别
区别: egrep、grep -E使用 逻辑标识符、数量标识符时,不用转义 grep 使用 逻辑标识符、数量标识符时,需要转义 作用: 同 grep -E 示例: 1.匹配 包含aaa的行 echo "aaa#bbb#ccc" | grep -E 'a{2}' echo "aaa#bbb#ccc" | egrep 'a{2}' echo "aaa#bbb#ccc" | grep 'a\{2\}' #不用-E参数时,需要对标识符转义
4.sed (Bash对文本的增删改查)
4.1 参数说明
作用: 根据指定规则修改文本内容(替换、删除) 目标源参数: -e(默认值) 将指定的文件复制到内存,并不会对原文件进行修改,可以处理 stdin和file -i 直接修改文件内容而不是打印,只能处理file -n 只打印被处理的行的内容 常用动作参数 -p 打印 一起使用 -r 在脚本中使用扩展正则表达式 动作参数: 行号a var: 行后插入 行号i var: 行前插入 行号x,yc var: x到y行内容 被var替换 行号x,yd var: x到y行内容 被删除 行号x,yp var: x到y行内容 被打印 /var/p var: 包含var的行被打印 s/old/new/ : 替换第一次出现的old s/old/new/g : 替换全局出现的old 标识符: $行尾表示标识符
4.2 sed -e '动作参数' [stdin|file]
方式1: 根据 行号处理文本 #删除 ’x,yd‘ --删除指定行,并打印处理后的文件内容 sed '1,2d' demo #删除 1到2行 内容 sed '3,$d' demo #删除 3到最后行 内容 #行后插入 '[RowNumber]a NewRowString' --在指定行后追加新行,并打印处理后的文件内容 sed '1a newRow' demo #在1行后添加 newRow sed '1a newRow1\newRow1' demo #在1行后添加 2行内容 #行前插入 ’[RowNumber]i NewRowString‘ --在指定行前插入新行,并打印处理后的文件内容 sed '1i newRow' demo #在1行前添加 newRow #替换 'x,yc NewRowString' --指定行数内容替换新内容,并打印处理后的文件内容 sed '1,3c newRow' demo #将1,3行内容替换为newRow 方式2: 根据 文本内容处理文本 's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,并打印处理后的文件内容 sed 's/[0-9]\+/@/g' demo #将多个数字字符替换成@(仅替换首次) sed 's/[0-9]\+/@/' demo #将多个数字字符替换成@(全局替换)
4.3 sed -i '动作参数' [file] (慎用,会直接修改文件)
方式1: 根据 文本行号处理文本 ’x,yd‘ --删除指定行,修改目标文件 sed -i '1,2d' demo #删除1,2行内容 '[RowNumber]a NewRowString' --在指定行后追加新行,修改目标文件 sed -i '1a newRow' demo #在1行后添加 newRow ’[RowNumber]i NewRowString‘ --在指定行前插入新行,修改目标文件 sed -i '1i newRow' demo #在1行前添加 newRow 'x,yc NewRowString' --指定行数内容替换新内容,修改目标文件 sed -i '1,3c newRow' demo #将1,3行内容替换为newRow 方式2: 根据 文本内容处理文本 's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,修改目标文件 sed -i 's/[0-9]\+/@/g' demo #将多个数字字符替换成@
4.4 sed -n '动作参数'
'x,yp' --显示 x到y行内容 sed -n '1,3p' demo #打印 1到3行内容 '/var/p' --显示 包含var的行 sed -n '/@/p' demo #打印 包含@的行
4.5 最佳实践-匹配到 ip addr命令中的ip
1.匹配到 ip addr命令中的ip [root@gaocun user]# ip addr | grep 'inet.*brd' | sed 's/\/.*//g' | sed 's/.* //g' 10.0.24.10
4.6 最佳实践-多点编辑
[root@gaocun user]# sed -e '1,3s/[0-9]/@/g' -e '6,$s/[0-9]/#/g' demo @ @ @ 4 5 # # # #
5. printf(格式化并打印数据)
格式: printf "指定格式" data1 data2 格式替换符 : %s - 字符串 %c - 字符 %d - 整数 %f - 浮点 %-5s - 左对齐(不指定时为右对齐) 5 任何字符串都内容都会被5个字符宽度显示,字符串不足5字符时会被空格符填充 %4.2f - 保留2位小数 示例: printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 -- 结果 姓名 性别 体重kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99
6. awk
6.1 基础
用途: 按照指定分隔符(默认为空格、\t)对文本进行分割,行分割符为\n,返回一个数组 并对元素进行操作 格式: awk -参数 '过滤条件 {操作动作 操作变量}' [stdin|file] 参数: -F指定分隔符 -v设置变量 操作动作: print 打印结尾添加\n printf 打印结尾不加\n 操作变量: $1 : 数组的第1个元素 $2 : 数组的第2个元素 $3 : 数组的第3个元素 $0 : 整行数据 var : 自定义变量 -vVarName=value NF : 每行的元素个数 NR : 当前行的行号 FS : 字符分隔符 FILENAME : 当前文件名
6.2 关于操作变量
#数组元素变量 echo "大王 小王 gao cun" |awk '{print \ "arr1:"$1 \ "\narr2:"$2 \ "\narr2:"$3 \ "\narr:"$0 \ }' #执行结果 arr1:大王 arr2:小王 arr2:gao arr:大王 小王 gao cun #自定义变量 方式1: echo "大王 小王 gao cun" |awk -vname=玫瑰 '{print $1,name,$2}' 大王 玫瑰 小王 方式2: echo "大王 小王 gao cun" |awk '{name="玫瑰"} {print $1,name,$2}' 大王 玫瑰 小王 #系统内置变量 echo "大王 小王 gao cun" |awk '{print \ "每行的元素个数:" NF \ "\n当前行的行号:" NR \ "\n字符分隔符:" FS \ "\n当前文件名:" FILENAME \ }'
6.3 每行按指定字符分割,并打印分割后的元素
#默认分隔符 空格或\t echo "大王 小王 gao cun" |awk '{print $1,$2,$3,$4}' 大王 小王 gao cun #指定单个分隔符 echo "大王#小王#gao@cun" |awk -F# '{print $1,$2,$3,$4}' 大王 小王 gao@cun #指定多个分隔符 echo "大王#小王#gao@cun" |awk -F[#@] '{print $1,$2,$3,$4}' 大王 小王 gao cun
6.4 运算符的使用
#过滤第一列的值>2的行 awk '$1>2' demo #过滤第一列的值=2的行 awk '$1==2 {printf $0}' demo #过滤第一列的值=2或第二列的值=g的行 awk '$1==2 || $2==g {printf $0}' demo
6.5 正则表达式的使用
#过滤第一列包含数字的行 awk '$1 ~ /[0-9]/' demo ~ 表示 模式开始(默认值) // 表示 模式内容 #模式取反 awk '$1 !~ /[0-9]/' demo awk '!/[0-9]/' demo
6.6 关于awk脚本(没用过,用的时候在补充)
#关键词
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
6.7 关于set、awk、grep 更适用哪些场景
grep 更适合单纯的查找或匹配文本 sed 更适合编辑匹配到的文本 awk 更适合格式化文本,对文本进行较复杂格式处理
7.diff、cmp、patch(对比文件的差异)
7.1 diff
#diff 功能: 逐行比较文本文件的差异 参数: -y side-by-sid 并排模式 -W 指定宽度 -b 忽略一行当中空白的差异 -B 忽略空白行的差异 -i 忽略大小写的差异 示例1: 比较两个文件(只打印差异内容) [root@gaocun user]# diff demo demo1 0a1 > 1 a 2d2 < 3 c 示例2: 并排格式输出(打印所有内容) [root@gaocun user]# diff demo demo1 -y -W 30 hahaha | 1 a 2 b 2 b 3 c < 4 d 4 d 5 e 5 e 6 f 6 f 7 h 7 h 8 g 8 g 9 i 9 i | 表示 同行号内容由差异 < 表示 文件2比文件1少一行 > 表示 文件2比文件1多一行
7.2 cmp
#cmp 功能: 对比两个文件字节的不同 [root@gaocun user]# cmp demo demo1 demo demo1 不同:第 1 字节,第 1 行
7.3 patch
#patch 功能: 将差异打补丁 #制作补丁(认为demo1为目标文件,将差异打在demo.patch中) diff -Naur demo demo1 > demo.patch #更新补丁(用补丁去更新demo,更新完后demo和demo1完全相同) patch -p0 demo < demo.patch #还原补丁(还原更新后的demo) patch -R -p0 demo < demo.patch
8. pr 打开文件-显示打开时间-档案名-页码
[root@gaocun user]# pr demo 2022-05-08 15:25 demo 第 1 页 hahaha
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
2020-05-08 06_数组
2020-05-08 05_IDEA
2020-05-08 04_流程控制语句
2020-05-08 03_方法