Shell 编程 —— 正则表达式与文本处理器
文章目录
1. 正则表达式
1.1 定义
- 正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。
- 功能:检索、替换、过滤符合特定规则的字符串。
1.2 用途
- 系统日志筛选(如定位“登录失败”“服务启动失败”)
- 配置文件解析
- 文本查找替换
- 脚本编程中的条件匹配
1.3 Linux 正则表达式分类
- BRE (基础正则表达式)
- 传统语法,功能有限
- 量词
{}
需要转义\{n,m\}
+
,?
,()
需要转义- 常用工具:
grep
、sed
- ERE (扩展正则表达式)
- 功能更强大,语法简洁
+
,?
,()
,{}
,|
等无需转义- 常用工具:
egrep
(grep -E
)、awk
1.4 正则表达式组成
1.4.1 普通字符
- 字母、数字、标点符号等本身。
1.4.2 元字符
-
.
匹配任意单个字符 -
匹配任意单个字符(除
\r\n
),就是“通配符”,你想匹配啥都行一个字符 -
[]
匹配字符集[a-z]
[0-9]
[A-Z]
匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]
-
[^list]
匹配非集合中的字符匹配任意不在list列表中的一个字符 例: [a-z]、[0-9]、[^A-Z0-9]
-
^
行首 -
$
行尾 -
\
转义符特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义
1.4.3 重复次数
-
*
0 次或多次匹配前面子表达式0次或者多次 例:goo*d、go.*d
-
\+
至少 1 次匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
-
\{n\}
恰好 n 次匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
-
\{m,n\}
m 到 n 次匹配前面的子表达式n到m次,例: go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字
-
\{n,\}
至少 n 次匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数字
注:
扩展
egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
egrep -E -n 'wo{2}d' test.txt //-E 用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt
案列:
+ 作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串
? 作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串
| 作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串
() 作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串
()+ 作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思
2. grep —— 条件查找
常用选项
-E
:启用扩展正则-c
:统计匹配行数-i
:忽略大小写-o
:只输出匹配内容-v
:反向匹配(不包含的行)-n
:显示行号--color=auto
:高亮匹配
示例
grep -c root /etc/passwd # 统计 root 出现的行数
grep -i "the" web.sh # 不区分大小写匹配
grep -v root /etc/passwd # 输出不包含 root 的行
grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' ifconfig.out | head -1 # 提取 IP 地址
3. 基础正则 vs 扩展正则
BRE 常见元字符
^
行首$
行尾.
任意单字符[list]
匹配字符集[^list]
反向匹配*
0 或多次\{n\}
精确次数\{n,\}
至少 n 次\{n,m\}
n~m 次
ERE 新增功能
+
一个或多个?
0 或 1 次|
或者(OR)()
分组()+
匹配重复的组
4. 元字符操作案例
- 查找特定字符
grep -n 'the' test.txt # 查找 the
grep -vn 'the' test.txt # 反向匹配
- 中括号集合
grep -n 'sh[io]rt' test.txt # shirt 或 short
grep -n '[^w]oo' test.txt # 前面不是 w 的 oo
- 定位符
grep -n '^the' test.txt # 行首是 the
grep -n '\.$' test.txt # 行尾是 .
grep -n '^$' test.txt # 空行
- 点与星
grep -n 'w..d' test.txt # w 开头 d 结尾,中间两个字符
grep -n 'woo*d' test.txt # w 开头 d 结尾,中间 o 可有可无
grep -n 'w.*d' test.txt # w 开头 d 结尾,中间任意字符
执行以下命令即可查询任意数字所在行。
grep -n '[0-9][0-9]*' test.txt
- 次数限定符
#查询两个 o 的字符。
grep -n 'o\{2\}' test.txt # oo
#查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
grep -n 'wo\{2,5\}d' test.txt # w 开头 d 结尾,2-5 个 o
#查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
grep -n 'wo\{2,\}d' test.txt # 至少两个 o
5.总结
正则表达式是一种用来描述字符串模式的规则。功能:检索、替换、过滤符合特定规则的字符串。
元字符
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个
-
^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^”
-
$ 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$”
-
. 匹配除“\r\n”之外的任何单个字符
-
\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
-
“*” 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*”
-
[] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
-
[^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plin”中任何一个字母
-
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。
注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身 -
{n} n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”
-
{n,} n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
-
{n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次