前言
linux通配符的英文名是wildcard,说白了一般只用于文件名匹配, 它是由shell解析的。而正则表达式呢?从简单的角度去理解,你可以把正则表达式看成是一种字符串匹配模式标准。
一、linux通配符
通配是把一个包含通配符的 非具体文件名 扩展存储在计算机、服务器或者网络上的 一批具体文件名 的过程。通配符是模糊匹配的基础,因为通配符机制的存在使得我们在查找文件的时候非常方便。
常用的通配符如下:
- 代表任意字符(0到多个)
? 代表一个任意字符
[] 代表匹配指定范围内的单个字符。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个之中的任何一个。
[ - ] 若有减号在中括号内时,代表在编码顺序内的所有字符。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的。
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示反向选择,匹配指定范围外的任意单个字符,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
- [^[0-9]]或[^0-9] 表示匹配数字外的任意字符
- [^[:upper:]] 表示匹配大写字母外的任意字符
- pa[0-9] 表示pa后面匹配一个数字
- pa[0-9][0-9] pa后面匹配两个数字
- [[:upper:]] 表示所有大写字母
- [[:lower:]] 表示所有小写字母
- [[:alpha:]] 表示所有字母
- [[:digit:]] 表示所有数字
- [[:alnum:]] 表示所有的字母和数字
- [[:space:]] 表示所有的空白字符
- [[:punct:]] 表示所有的标点符号
特殊符号
\ 转义字符 将特殊字符或通配符还原成一般符号
; 连续命令分割符号
/ 目录符号,路径分割
# 注释说明
$ 变量前需要加的变量值
二、正则表达式
正则表达式RE(Regular Expression)是由一串字符和元字符(描述字符的字符)构成的字符串。
正则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。实际上正则表达式完成了数据的过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据。
bash shell本身不支持正则表达式,使用正则表达式的是shell命令和工具,如grep,sed,awk。
grep:文本过滤工具,基于正则表达式进行模式匹配
sed:stream editor 流编辑器
awk:linux上实现为gawk,文本报告生成器(格式化文本)
grep
- 文本搜索工具,根据用户指定的模式,对目标文本逐行进行匹配检查,打印匹配到的行
- 基于Perl的正则表达式
使用格式:grep [选项] 匹配模式 file对象
选项说明:
-E:使用扩展正则表达式,等同于egrep
-F:使用固定字符串进行匹配
-l:列出匹配模式的文件名称,而不是打印匹配的行
-q:静默模式,匹配grep则成功退出,不匹配则写入标准输出
-S:不显示错误信息
-i:忽略字符大小写
-v:反向查找,显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-A(after):显示匹配到的行和其后面的行,给一个数字
grep -A 1 root /etc/passwd
-B(before):显示匹配到的行和其前面的行,给一个数字
grep -B 1 root /etc/passwd
-C(center):显示匹配到的行和其前后的行,给一个数字
grep -C 1 root /etc/passwd
–color:显示颜色
# alias grep='grep --color'
# grep 'root' /etc/passwd
1、字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^ ] 匹配指定范围外的任意单个字符
[[:digit:]] [[:lower:]] [[:upper:]] [[:alpha:]] [[:alnum:]] [[:punct:]] [[:space:]]
2、匹配次数
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认为贪婪模式
* 表示匹配其前面的字符任意次,0,1,多次
.* 匹配任意长度的任意字符
\? 匹配其前面的字符0次或一次
\+ 匹配其前面的字符一次或多次,即其前面的字符要出现至少一次
\{m\} 精确匹配到其前面字符的m次
\{m,n\} 匹配其前面的字符至少m次,至多n次
\{0,n\} 匹配其前面的字符至多n次
\{m,0\} 匹配其前面的字符至少m次
3、位置锚定
^ 行首锚定,用于模式的最左边
$ 行尾锚定,用于模式的最右边
^pattern$ 用于pattern来匹配整行
^$ 匹配空白行
^[[:space:]]$ 匹配空行或空白字符的行
单词 非特殊字符组成的连续字符都称为单词
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<pattern\> 匹配完整单词
三、正则表达式的扩展
egrep等效于grep -E ,基于扩展的正则表达式做模式匹配,那什么是扩展的正则表达式(Extended Regular Expression, ERE)呢?
支持扩展的正则表达式实现类似于grep文本过滤功能:grep -E
-o , -i , -v , -q , -A , -B , -C ,
-G:表示支持基本正则表达式
扩展正则表达式的元字符
1:字符匹配
. :匹配任意单个字符
[ ]:匹配指定范围内的任意单个字符
[^ ]:匹配指定范围外的任意单个字符
[[:digit:]] [[:lower:]] [[:upper:]] [[:alpha:]] [[:alnum:]] [[:punct:]] [[:space:]]
2:次数匹配 (相对于基本正则表达式,它不用再加反斜杠)
*:任意次,0,1或多次
?:0次或1次,其前的字符是可有可无的
+:其前字符至少1次
{m}:匹配其前的字符m次
{m,n}:至少m次,至多n次
{0,n}:至多n
{m,0}:至少m次
3:位置锚定
^:行首锚定
$:行尾锚定
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
4:分组及引用 (分组和引用,也就搞定了Python的正则表达式)
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
( ):分组,括号内的模式匹配到的字符会被记录到正则表达式引擎的内部变量中
后向引用:/1, /2
[root@7 yhy2]# cat yhy
wo love wo
ni love ni
ta love ta
egrep "(w.).*\1" yhy
wo love wo
5、|
a | b:表示a或者b ---> grep "a|b" yhy
c|Cat:c或者Cat
(c|C)at:cat或者Cat
练习
1:显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v .*/bin/bash$ /etc/passwd
或grep -v "/bin/bash" /etc/passwd
其中,-v 表示显示没有匹配到的行; .* 表示任意长度的任意字符; $表示行尾锚定,匹配输入字符串的结尾位置
2:找出/etc/passwd文件中的两位数或三位数的行
egrep [0-9]{2,3} /etc/passwd
其中[0-9]代表0到9之间的任意一个数字;{2,3} 表示匹配其前面的字符至少2次,至多3次
3:找出/etc/rc.d/rc.sysinit(centos 6)或/etc/grub2.cfg(centos 7)文件中,以至少一个空白字符开头,且后面有非空白字符的行
egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
其中^[[:space:]] 表示以空白字符开头; [^ ] 表示匹配范围外的任意单个字符;+ 表示匹配1次或多次,至少1次
4:找出”netstat -tan”命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行
nestat -tan |grep "LISEN[[:space:]]*$"
注意:区分 * 和 + ,*表示任意次,0,1或多次;+表示1次或多次,至少1次