什么是正则表达式?
- 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则的包含匹配。
- 通配符用来匹配符合条件的文件名,通配符的完全匹配。
正则表达式
字符匹配符号
.: 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符;如coo[kl]匹配cook或cool
[^]:匹配指定范围外的任意单个字符;如9[^01]匹配92、93、94等,但是不能匹配91或90
[-] 匹配[]中指定范围内的任意一个字符;如[a-f]匹配从a到f之间的小写字母
大写 [[:upper:]] 或 [A-Z]
小写 [[:lower:]] 或 [a-z]
字母 [[:alpha:]] 或 [a-Z]
字母 数字[[:alnum:]]
空格或者制表符 [[:blank:]]
纯数字 [[:digit:]] 或 [0-9]
标点符号 [[:punct:]]
匹配次数符合:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
*:匹配前面的字符任意次;
.*:任意长度的任意字符;
\?:匹配其前面的字符出现0或1次;即前面的可有可无
\+:匹配其前面的字符出现至少1次;如ro9+匹配ro9或ro99或ro999等
\{m\}:匹配前面的字符出现m次;如[0-9]{3}匹配任意一个三位数,[0-9]{3}可以扩展为[0-9][0-9][0-9]
\{m,n\}:匹配前面的字符出现至少m次,最多n次;
\{0,n\}:匹配前面的字符出现最多n次;
\{m,\}:匹配前面的字符出现至少m次;如[0-9]\{1,\}匹配任意一个两位或更多位的数字
位置锚定符号:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$: 用于模式匹配整行;
^$: 空行;
^[[:space:]]*$
\< 或 \b:词首锚定;用于单词模式的左侧;
\> 或 \b:词尾锚定;用于单词模式的右侧;
\:匹配整个单词;
分组:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2,...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1:表示第一的()里的内容 ab\+\(xy\)*
\2:表示第二的()里的内容 xy
支持后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
其他符号规则
.. 匹配任意两个字符
| 匹配|两边的任意一项,如oc(mm|nn)匹配ocmm或ocnn
\ 转义符可以将上面介绍的特殊字符进行转义,如a\.b匹配a.b但不能匹配ajb。通过在.之前加上\从而忽略了.的特殊意义
来些示例
[root@anuo ~]# cat test
root
Root
rot
boot
Rot
111
222
,123
.456
haha
hello
A1234
A123
A12
A1
A
1、查找A后有0到多个数字
[root@anuo ~]# egrep A[0-9]* test --*表示前一个字符有0个或多个
A1234
A123
A12
A1
A
2、查找A后有1到多个数字,所以相对于上面的显示,最后一行没有了(等同于egrep -n "A[0-9]+" grep.txt)
[root@anuo ~]# egrep "A[0-9][0-9]*" test 或 egrep 'A[0-9]+' test.txt
A1234
A123
A12
A1
3、+号意思是前一个字符有1个或多个
[root@anuo ~]# egrep A[0-9]+ test
A1234
A123
A12
A1
4、过滤掉以空格开头的行和去掉空行再去掉以.或以,开头的行
[root@anuo ~]# cat grep.txt |grep -v ^[[:blank:]]|grep -v ^$ |grep -Ev ^"\.|,"
5、过滤掉以#号开头的行,空行,以AB开头的行,以及so结尾的行
[root@anuo ~]# cat /etc/httpd/conf/httpd.conf |grep -v "#"|grep -v ^$ |grep --v '^A|B'|grep -v so$
匹配日期格式YYYY-MM-DD
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
匹配IP地址
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\
总结Linux常用的一些特殊符合
* 表示所有(0到多个)字符。
? 是通配符,代表任意一个字符。
; 一般用于连续不同命令时的分隔符。
# 注释符。
| 管道
~ 表示用户的家目录
/ 路径分隔符
> 重定向,会覆盖老的内容
>> 追加重定向,在老的内容后面追加
< 输入重定向
<< 追加输入重定向
'' 单引号,不具有变量置换功能,输出时所见即所得
"" 双引号,具有变量置换功能,解析变量后输出,
`` 反引号,tab键上面的的键,反引号中间为命令,会先执行,等价$()
{} 中间为命令区块组合或内容序列
! 逻辑非
&& 逻辑与,前一个指令执行成功时,执行后一个指令,也就是两个指令都会执行
|| 逻辑或,前一个指令执行失败时,执行后一个指令,两个指令只会执行一个