Shell(二):正则表达式
1、元字符
Shell的表达式是一串字符。元字符(Metacharacters)是用来阐释字符表达式意义的字符。元字符就是描述字符的字符,用于对字符表达式的内容、转换及各种操作信息进行描述。
2、正则表达式
正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正则表达式的主要功能是文本查询和字符串操作,可以匹配文本的一个字符或字符集合。
正则表达式的数据处理过程:
正则表达式的基本元素包括:普通字符 和 元字符。
2.1、基本的正则表达式
基本的正则表达式元字符集合及含义:
符号 |
含义 |
* |
0个或多个在*字符之前的普通字符 |
. |
匹配任意字符 |
^ |
匹配行首,或后面字符的非 |
$ |
匹配行尾 |
[] |
匹配字符集合 |
\ |
转义符,屏蔽一个元字符的特殊意义 |
\<\> |
精确匹配符号 |
\{n\} |
匹配前面字符出现n次 |
\{n,\} |
匹配前面字符至少出现n次 |
\{n,m\} |
匹配前面字符出现n~m次 |
2.1.1、"*" 符号
匹配前面一个普通字符的0此或多次重复,如 Jav*。
"*"符号前是普通字符v,*字符表示匹配v字符0次或多次,如字符串Java、Javva、Javvvv。
2.1.2、"." 符号
"."符号只能匹配一个字符,可以匹配一个空格,如...SC.。
..SC.表示前面两个字符为任意字符,第3和第4个字符是S和C,最后一个字符为任意字符,如 laSC8、P SC3。
2.1.3、"^"符号
"^"符号用于匹配行首,表示行首的字符是 "^" 字符后面的那个字符,如 ^Shell,表示匹配以Shell开头的行。
2.1.4、"$"符号
"$"符号匹配行尾,$符号放在匹配字符之后,与"^"符号的功能和用法都相反,如 Shell$,表示以Shell结尾的所有行。
匹配所有空行:^$,行首与行尾间没有任何字符,为空行。
2.1.5、"[]"符号
匹配字符集合,支持穷举法列出字符集合的所有元素,也支持使用"-"符号表示字符集合返回,表明字符集合范围从"-"左边字符看是,到"-"右边字符结束。
任意数据的匹配方法:[0123456789] 或 [0-9]
任意字符的匹配方法:[a-z] 、 [A-Z]
注意:
"^"符号放在"[]"符号中,表示的是取反符号,如 [^c-e],表示不在 c ~ e 范围内的字符,实际上涵盖了除了小写字母 c、d和e之外的所有字符。
2.1.6、"\"符号
"\"符号是转义符,用于屏蔽一个元字符的特殊意义,即以为字面含义结束"\"符号后面的元字符。
如 "\.",经过转义后"."不在表示任意一个字符,而是一个普通字符 "."。
2.1.7、"\<\>"符号
"\<\>"符号是精确匹配符号,该符号利用"\"符号屏蔽"<>"符号,如 \<she\> ,该正则表达式精确匹配She这个单词,不匹配包含 She 字符的单词,如Shell。
2.1.8、"\{\}"系列符号
"\{\}"系列符号与"*"符号类似,都表示前一个字符的重复。但,"*"符号表示重复0次或任意次,而"\{\}"系列符号可以指定重复次数,"\{\}"系列符号包括以下三种形式:
\{n\} |
匹配前面字符出现n次 |
JO\{3}\B -> 重复字符O 3次 -> JOOOB |
\{n,\} |
匹配前面字符至少出现n次 |
JO\{3,\}B -> 重复字符O 至少三次 -> JOOOB、JOOOOB |
\{n,m\} |
匹配前面字符出现n~m次 |
JO\{3,6\}B表示重复字符O至少3次,至多6次 -> JOOOB、JOOOOOOB |
[A-Z]\{3\},精确匹配3个大写英文字母,如 SHE。
2.2、拓展的正则表达式
拓展正则表达式元字符及意义:
符号 |
含义 |
? |
匹配0个或1个在其之前的那个普通字符 |
+ |
匹配1个或多个在其之前的那个普通字符 |
() |
表示一个字符集合或用在expr中 |
| |
表示"或",匹配一组可选的字符 |
2.2.1、"?"符号
匹配"?"符号之前的那个字符0次或1次。
如 JO?B,该表达式表示匹配O字符0此或1次,匹配 JOB 或 JOOB。
注意:"?"符号至多可匹配1个字符。
2.2.2、"+"符号
匹配前面字符多次,与"*"不同的是,"*"符号可以匹配0次,而"+"符号至少匹配1次。
如 S+EU,表示匹配 S 1次或任意次,SSEU、SSSSSSEU,但SEU不能有S+EU匹配,但可以被 S*EU匹配。
2.2.3、"()"符号和"|"符号
"()"符号通常与"|"符号结合使用,表示一组可选字符的集合。
如 re(a|e|o)d,该表达式(a|e|o)表示在字符a、e、o中选择任意一个字符,即read、reed、reod都可由该表达式匹配。
"()"符号可以被"[]"符号替代,re(a|e|o)d 等价于 re[aeo]d。
2.3、通配
通配是把一个包含通配符的非具体文件名拓展存储在计算机、服务器或者网络上的一批具体文件名的过程。
最常用的通配符包括正则表达式元字符:?、*、[]、^等。这些元字符在通配中的意义与正则表达式中的意义不完全一致,*符号不再表示器前面字符的重复,而是表示任意位的任意字符,?字符表示一个任意字符,^符号在通配中不代表行首,而是代表取反。
ls命令用于列出目录下的而文件,ls -l 表示列出文件的详细信息,ll命令等价于ls -l命令。
/home/shell/script/fundation目录下的所有文件,如下:
匹配所有 .txt 结尾的文件:
匹配所有 shell0开头、后面跟1个字符且以.sh为后缀的文件:
匹配所有 a ~ n 范围内字母开头、且后缀为.sh的文件:
通配的结果是由计算机搜索大量的文件或目录进行匹配而输出,通配对处理能力和内存资源有很高的需求。
3、grep命令
GREP是 Global search Regular Expression and Print out the line,即全面搜索正则表达式并把行打印出来。GREP是一种强大的文本搜索工具,它能使用正则表达式搜索文件,并把匹配的行打印出来。
3.1、grep命令的基本用法
grep命令是支持正则表达式的一个多用途文本搜索工具,grep的一般格式为:
grep [option] [mode] [file...]
grep命令由选项、模式、文件三部分组成,在一个或多个文件中搜索满足模式的文本行,模板后的所有字符串被看做文件名,文件名可以有多个,搜索的结果被打印到屏幕,不影响原文件的内容。
grep命令选项及含义:
option
|
含义
|
-c
|
只输出匹配行的数量
|
-i
|
搜索时忽略大小写
|
-h
|
查询多文件时不显示文件名
|
-l
|
只列出符合匹配的文件名,而不列出具体的匹配行
|
-n
|
列出所有的匹配行,并显示行号
|
-s
|
不显示不存在或无匹配文本的错误消息
|
-v
|
显示不包含匹配文件的所有行
|
-w
|
匹配整词
|
-x
|
匹配整行
|
-r
|
递归搜索,不仅搜索当前工作目录,而且搜索子目录
|
-q
|
禁止输出任何结果,以退出状态表示搜索是否成功
|
-b
|
打印匹配行距文件头部的偏移量,以字节为单位
|
-o
|
与-b结合使用,打印匹配的词距文件头的偏移量,以字节为单位
|
-E
|
支持拓展的正则表达式
|
-F
|
不支持正则表达式,按照字符串的字面意思进行匹配
|
grep命令的模式可以是字符串,也可以是变量,还可以是正则表达式。无论何种模式,只要模式中包含空格,就需要使用双引号将模式引起来,不加双引号,空格后的单词会被误认为是文件名。
在for04.sh文件中,搜索 for 字符:
grep支持多文件查看:
grep指定多个文件时可使用通配:
-c选项,输出匹配字符串行的数量,默认情况下,grep命令打印出包含模式的所有行,一旦加上 -c 选线能够,就只显示包含模式行的数量。
-n选项,列出所有的匹配行,默认情况下,grep搜索单个文件时,只显示每行的内容,搜索多个文件时,显示文件名及每行的内容,加上-n选项后,将在行内容前附件显示行号。
-v选项,不包含模式的所有行:
for0*.sh文件中有4行不包含 for 字符串。
-i选项,grep命令对大小写敏感,加上-i选项表示grep命令不区分大小写。
-h选项,查询多文件时不显示文件名,默认情况下,grep命令查询多个文件时,在匹配行之前显示文件名,加上 -h 选项后,grep命令将不再显示文件名。
-l选项,只列出符合匹配的文件名,而不列出具体匹配行:
-s选项,不显示不存在或无匹配文本的错误信息,默认情况下,grep在待搜索文件不存在或搜索不到符合模式的文本行时将打印错误信息。
3.2、grep和正则表达式结合使用
3.2.1、搜索文件的空白行
3.2.2、设置大小写
利用-i符号可以使grep命令不区分大小写,也可利用 [] 符号设置大小写。