Shell—4.通配符&正则
正则表达式用来在文件中匹配符合条件的字符串 正则是包含匹配 grep awk sed等命令可以支持正则
通配符用来匹配符合条件的文件名。通配符是完全匹配,ls find cp 命令不支持正则,只能shell通配符匹配
通配符
- * 匹配任意多个字符
- ? 匹配任意一个字符
- [] 匹配括号中任意一个字符
- () 在子shell中执行
- {} 集合 touch file{}
- \ 转义符
cp -rv /etc/sysconfig/network-scripts/{ifcfg-eth0,ifcfg-eth0.old}
cp -rv /etc/sysconfig/network-scripts/ifcfg-eth0{,.old}
- grep "aa*" xx.log 解析: 因为*是匹配前一个字符0次或多次 匹配最少有一个a的行
- grep "s..d" xx.log 解析: .只匹配一个非换行符的字符,如果s和d之间只有1个字符,则不匹配
- grep "^$" xx.log 解析: ^是以什么开头 $是以什么结尾 ^$组合就是空白行的意思 打印看不到 就加个-n
- grep "^[0-9]" xx.log 解析: 中括号的意思是匹配中括号内任意一个字符 加上^意思就是匹配数字开头的行 0-9就是0到9任意数
- grep "^[^a-zA-Z]" xx.log 解析: ^在括号里的意思是匹配取反,意思是不要a-z和A-Z,加上括号外^,就是不以小写字母开头的
- grep "\.$" xx.log 解析: \是转义符 意思让.有实际意义 意思是去.结尾的行
- grep "a\{3\}" xx.log 解析: \{n\}表示其前面的字符恰好出现n次 注意 3和3,是有区别的, 3,代表3次
- grep "sa\{1,3\}" xx.log 解析: 匹配前边的字符至少1次,之多3次
ls -l file[1-13].txt # 先匹配1-1 再匹配3
ls -l file[2-14].txt # 只能匹配出4
ls -l file[1-10].txt # 只能匹配1
ls -l file[0-9,10,11].txt # 只匹配1到9
ls -l file[!0-4].txt # 反选1234
ls -l file{1,3,11,13}.txt # 匹配1 3 11 13
正则表达式
- regular expression
- linux python golang支持正则表达式
- 应用场景 过滤有规律的内容 尤其是日志
- 注意事项
| 所有的符号 英文符号
| 学习正则 通过grep命令学习 用的时候grep,后边加上单引号
| 给grep egrep加上颜色 alias grep='grep --color=auto' alias egrep='egrep --color=auto'
| 注意系统的字符集 en_US.UTF-8(大部分情况90%没问题)如果出现问题修改字符集为C export LANG=C
| 快速掌握正则:需要配合grep -o参数学习
- 正则的分类
| 基础正则(BRE) ^ $ ^$ . * .* [a-z] [^abc]
| 扩展正则(ERE) + | () {} ?
- 正则vs通配符
| 1.正则用途 三剑客 高级语言 进行过滤(匹配字符)
| 2.三剑客 expr rename支持正则
|
| 1.通配符(pathname extension glob) 匹配文件(文件名) *.txt *.log
| 2.linux下大部分命令都可以用
元字符
- 1. ^ 行首定位符 // 以什么开头
- 2. $ 行尾定位符 // 以什么结尾
| cat -A 文件名 // 会看到行尾有$
- 3. ^$ 表示空白行
| cat -v "^$" 排除空行
- 4. . 匹配单个字符 // 表示任意一个字符,不匹配空白行
- 5. * 匹配前导符0到多次
- 6. .* 任意多个字符 在正则里表示所有内容
- 7. [] 匹配指定范围内的一个字符 // [lL]ove
- 8. [-] 匹配指定范围内的一个字符 // [a-zA-Z]ove
- 9. [^] 匹配不在指定组内的字符 // [^a-zA-Z]ove
- 10. \ 转义字符 脱掉马甲马甲打回原形 去除原有特殊含义
| 转义字符序列: \n 回车换行 \t tab键
- 11. \< 词首定位符
- 12. \> 词尾定位符
- 13. \(..\) 匹配稍后使用的字符的标签
- 14. x\{m\} 字符x重复出现m次
- 15. x\{m,\} 字符x重复出现m次以上
- 16. x\{m,n\} 字符x重复出现m到n次
- 扩展正则部分,支持扩展:egrep / sed -r / awk / grep -E
| 1. + 前一个字符出现1次或多次
| 2. | 可以匹配一个字符或多个字符 见下图
| 3. () 被括起来的内容表示一个整体;后向引用(反向引用 sed)
| 4. {} 前面字符出现次数 // 扩展正则,两种括号都不用加 \
| 5. ? 前一个字符出现0次或1次
- 正则特色 贪婪匹配 ".*"或"*"连续出现的时候,表现出仅可能贪婪匹配
- 2* 2出现0次或多次;0次相当于什么都没有;所以2*就是所有都出来了
- egrep -o "[a-Z]+" 匹配出所有单词
bash的引号
- 双引号 会把引号的内容当成整体来看待 允许通过$符号引用其他变量值
- 单引号 会把引号内容当成整体来看待,禁止引用其他变量值 shell中特殊符号都被视为普通字符
- 反撇号 反撇号和$()一样,引号或括号里的命令会优先执行 如果存在嵌套 反撇号不能用
echo "$(date +%F)" == echo "`date +%F`"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)