记录 shell学习过程(9)正则表达式 转自树明聊运维
正则表达式
- 正则表达式介绍
- 特殊字符
- POSIX特殊字符
一、正则表达式介绍
正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。
正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。
正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!
shell也支持正则表达式,但不是所有的命令都支持正则表达式,常见的的命令中只有grep、sed、awk命令支持正则表达式。
特殊说明
测试数据: #cat file
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
bb
a_c
aZc
aAAAAc
a c
ABC
ccc
dddd
http://www
abababab
c c d
123
a3c
e*f
二、特殊字符
定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头和结尾,做模糊匹配。
| 定位符 | 说明 |
|---|---|
| ^ | 锚定开头 ^a 以a开头 默认锚定一个字符 |
| $ | 锚定结尾 a$ 以a结尾 默认锚定一个字符 |
测试案例
1)精确匹配 以a开头c结尾的字符串
[root@www ~]# egrep "^ac$" file
ac
2)模糊匹配 以a开头
[root@www ~]# egrep "^a" file
ac
ab
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
asb
aa
a_c
aZc
aAAAAc
a c
abababab
a3c
3)模糊匹配 以c结尾的字符串
[root@www ~]# egrep "c$" file
ac
abbc
abcc
aabbcc
abbbc
abbbbbc
acc
abc
a_c
aZc
aAAAAc
a c
ccc
a3c
匹配符:匹配字符串
| 匹配符 | 说明 | |
|---|---|---|
| . | 匹配除回车以外的任意字符 | |
| ( ) | 字符串分组 | |
| [ ] | 定义字符类,匹配括号中的一个字符 | |
| [ ^ ] | 表示否定括号中出现字符类中的字符,取反。 | |
| \ | 转义字符 | |
| \ | 或 |
测试案例
1)精确匹配 以a开头c结尾 中间任意 长度为三个字节的字符串
[root@www ~]# egrep "^a.c$" file
acc
abc
a_c
aZc
a c
a3c
2)模糊匹配 以cc结尾的字符串 因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
[root@www ~]# egrep "(cc)$" file
abcc
aabbcc
acc
ccc
3)精确匹配 以a开头c结尾 中间是a-z,0-9 长度为三个字节的字符串
[root@www ~]# egrep "^a[a-z0-9]c$" file
acc
abc
a3c
4)精确匹配 以a开头c结尾 中间不包含a-z,0-9 长度为三个字节的字符串
[root@www ~]# egrep "^a[^a-z0-9]c$" file
a_c
aZc
a c
5)精确匹配 以e开头f结尾 中间是*号 长度为三个字节的字符串 e*f
[root@www ~]# egrep "^e\*f$" file
e*f
6)精确匹配 以a开头b或c结尾 中间是任意 长度为三个字节的字符串
[root@www ~]# egrep "^a.(b|c)$" file
acc
abc
asb
a_c
aZc
a c
a3c
限定符:对前面的字符或者字符串做限定说明
| 限定符 | 说明 |
|---|---|
| * | 某个字符之后加星号表示该字符不出现或出现多次 |
| ? | 与星号相似,但略有变化,表示该字符出现一次或不出现 |
| + | 与星号相似,表示其前面字符出现一次或多次,但必须出现一次 |
| {n,m} | 某个字符之后出现,表示该字符最少n次,最多m次 |
| {m} | 正好出现了m次 |
测试案例
1)精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
[root@www ~]# egrep "^ab*c$" file
ac
abbc
abbbc
abbbbbc
abc
2)精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
[root@www ~]# egrep "^ab?c$" file
ac
abc
3)精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
[root@www ~]# egrep "^ab+c$" file
abbc
abbbc
abbbbbc
abc
4)精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
[root@www ~]# egrep "^ab{2,4}c$" file
abbc
abbbc
5)精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
[root@www ~]# egrep "^ab{3}c$" file
abbbc
6) 精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
[root@www ~]# egrep "^ab{1,}c$" file
abbc
abbbc
abbbbbc
abc
三、POSIX特殊字符
| 特殊字符 | 说明 |
|---|---|
| [:alnum:] | 匹配任意字母字符0-9 a-z A-Z |
| [:alpha:] | 匹配任意字母,大写或小写 |
| [:digit:] | 数字 0-9 |
| [:graph:] | 非空字符( 非空格控制字符) |
| [:lower:] | 小写字符a-z |
| [:upper:] | 大写字符A-Z |
| [:cntrl:] | 控制字符 |
| [:print:] | 非空字符( 包括空格) |
| [:punct:] | 标点符号 |
| [:blank:] | 空格和TAB字符 |
| [:xdigit:] | 16 进制数字 |
| [:space:] | 所有空白字符( 新行、空格、制表符) |
测试案例
注意[[ ]] 双中括号的意思: 第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
1)精确匹配 以a开头c结尾 中间a-zA-Z0-9任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:alnum:]]c$" file
acc
abc
aZc
a3c
2)精确匹配 以a开头c结尾 中间是a-zA-Z任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:alpha:]]c$" file
acc
abc
aZc
3)精确匹配 以a开头c结尾 中间是0-9任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:digit:]]c$" file
a3c
4)精确匹配 以a开头c结尾 中间是a-z任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:lower:]]c$" file
acc
abc
4)精确匹配 以a开头c结尾 中间是A-Z任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:upper:]]c$" file
aZc
5)精确匹配 以a开头c结尾 中间是非空任意字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:print:]]c$" file
acc
abc
a_c
aZc
a c
a3c
6)精确匹配 以a开头c结尾 中间是符号字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:punct:]]c$" file
a_c
7)精确匹配 以a开头c结尾 中间是空格或者TAB符字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:blank:]]c$" file
a c
类似
[root@www ~]# egrep "^a[[:space:]]c$" file
a c
8)精确匹配 以a开头c结尾 中间是十六进制字符 长度为三个字节的字符串
[root@www ~]# egrep "^a[[:xdigit:]]c$" file
acc
abc
a3c
说明:特殊字符和POSIX字符是两套字符,都可以完成需要的匹配,大家学习的时候最少要记住一套字符并熟练应用。
案例一 匹配合法的IP地址
grep '^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$' --color ip_base
案例二 匹配座机电话号码
egrep "^[[:graph:]]{12}$" number |egrep "^(0[1-9][0-9][0-9]?)-[1-9][0-9]{6,7}$"
树明聊运维®
云计算、大数据、开发运维
Copyright © 树明聊运维 all right reserved, powered by skyFi
阿依吐拉(ayitula.com) 首个运维开源资源模块 2019-11-03 15:46:32
记录 shell学习过程(9)正则表达式 转自树明聊运维的更多相关文章
- 记录 shell学习过程(10 ) shell 对文件的操作
0.sed 常用内部命令 a 在匹配后面添加 i 在匹配前面添加 p 打印 d 删除 s 查找替换 c 更改 y 转换 N D P 下面用a来演示 1.sed 'a 追加内容' 文件 # sed 'a ...
- 记录 shell学习过程(7) case 以及 shell 的特殊变量
case 语法 read -p "num:" n case $n in ) echo haha ;; ) echo hehe ;; ) echo heiehi ;; *) echo ...
- 记录 shell学习过程(4)for 循环
1. for in ` #seq 生成从1到10 如果生成从10到1则写作 seq 10 -1 1 do echo $i done for in 也可以循环出字符串 for i in where is ...
- 记录 shell学习过程(11 ) shell 对输出流的处理
语法 awk [options] [BEGIN] {program} [END] [file] 常用命令选项 -F fs 指定描绘一行中数据字段的文件分隔符 默认为空格 -f file 指定读取程序 ...
- 记录 shell学习过程(8)函数
start () { echo "Apache start ...... [OK]" #return 0 可以写一个返回值,比如执行成功返回 0 } stop () { echo ...
- 记录 shell学习过程(6)while 以及 while的嵌套 以及 until
while中的5种条件 1.数学比较 read -p "Num :" num1 ] do echo 'greater' sleep done 2.字符串比较 read -p &qu ...
- 记录 shell学习过程(5)continue break
1.continue ;i<;i++)) do ];then continue fi echo $i done # ./continue.sh12346789 2.break ;i<;i+ ...
- 记录 shell学习过程(3) if 的格式
] #-e 为检测目录或文件是否存在 !为取反 then mkdir -v /tmp/ echo 'ok' fi if else if [ $USER == 'root' ] then echo 'h ...
- 记录 shell学习过程(2) read的用法
echo -n "login:"read username #read后面直接使用一个变量用于接收输入的数据 echo -n "password:"read ...
随机推荐
- stream重复Key的处理
Map<String, List<Model>> modelMap = modelList .stream() .collect(Collectors .toMap(model ...
- 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...
- P1478 陶陶摘苹果(升级版)(sort(),时间优化,priority_queue)
题目描述 又是一年秋季时,陶陶家的苹果树结了 n 个果子.陶陶又跑去摘苹果,这次他有一个 a 公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与 NOIp2005 普及组第一题不同的是:陶陶之 ...
- [大数据技术]datax的安装以及使用
1.datax简述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.Ta ...
- 如何将博客搬至CSDN
简单聊下对于博客园的印象是技术改变世界,作为一个IT技术人员很乐意把这里当作自己的网上家园,每天在这里分享着精彩的原创内容,看重的不是华丽的外表.诱人的虚名,而是纯净.专注.对技术人员的理解. CSD ...
- 安装Kibana到Linux(源码)
运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Kibana-7.1.0 硬件要求:最低2核4GB 安装过程 1.源码安装JDK 1.1.从官网 ...
- PAT (Basic Level) Practice (中文)1023 组个最小数 (20 分) (排序)
给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就 ...
- tmp = 2/4;竟然没有发现的
我还纠结着单目运算符和双目运算符和乘除的一些优先级什么事情. #include "common.h" #include <stdio.h> #include <s ...
- 133.在django中使用memcached
1. 在django中使用memcached,可以在settings.py文件中DATABASES变量下面配置CACHES缓存相关配置信息,只允许本机连接memcached就可以设置LOCATION为 ...
- springboot~gradle4.7之后的lombok引用方法
在gradle4.7以后对于加入依赖lombok方式发生变化,gradle4.7版本以前,可以直接如下引用: compile("org.projectlombok:lombok:1.18.2 ...