Linux操作系统-shell编程之Grep与正则表达式
一、GREP
GREP:Global search regular expression(RE),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
GREP语法格式:
grep -[acinv] ‘word’ Filename
GREP参数详解:
-a :以文本文件方式搜索;
-c :计算找到的符合行的次数;
-i :忽略大小写;
-n:顺便输出行号;
-v:反向选择,即显示不包含匹配文本的所有行;
-h:查询多文件时不显示文件名;
-l :查询多文件时只输出包含匹配字符的文件名;
-s:不显示不存在或无匹配文本的错误信息;
-E:允许使用egrep扩展模式匹配;
-r:递归搜索;
-o: 匹配搜索的字符串。
二、正则表达式
正则表达式:处理字符串的方法,它是以行为单位来进行字符串处理的行为,正则表达式透过一些特殊字符的辅助,可以让使用者轻易达到搜索、删除、替换某特定字串的处理程序。
正则表达式分为基础正则表达式及扩展正则表达式,如下将介绍用法:
1、基础正则表达式
#################常用符号#################
. 表示任意单个字符。
* 表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身。
[ ] 表示匹配指定范围内的任意单个字符。
[^ ] 表示匹配指定范围外的任意单个字符。
#################单个字符匹配#################
[[:alpha:]]或[a-zA-Z] 表示任意大小写字母。
[[:lower:]]或[a-z] 表示任意小写字母。
[[:upper:]]或[A-Z] 表示任意大写字母。
[[:digit:]]或[0-9] 表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]]或[a-zA-Z0-9] 表示任意数字或字母。
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]] 表示任意标点符号。
[^[:alpha:]]或[^a-zA-Z] 表示单个非字母字符。
[^[:lower:]]或[^a-z] 表示单个非小写字母字符。
[^[:upper:]]或[^A-Z] 表示单个非大写字母字符。
[^[:digit:]]或[^0-9] 表示单个非数字字符。
[^[:alnum:]]或[^a-zA-Z0-9]表示单个非数字非字母字符。
[^[:space:]] 表示单个非空白字符。
[^[:punct:]] 表示单个非标点符号字符。
#简短格式并非所有正则表达式解析器都可以识别。
\d 表示任意单个0到9的数字。
\D 表示任意单个非数字字符。
\t 表示匹配单个横向制表符(相当于一个tab键)。
\s 表示匹配单个空白字符,包括"空格","tab制表符"等。
\S 表示匹配单个非空白字符。
#################次数匹配#################
\? 表示匹配其前面的字符0或1次
\+ 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
\{n\} 表示前面的字符连续出现n次,将会被匹配到。
\{x,y\} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。
\{,n\} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
\{n,\} 表示之前的字符连续出现至少n次,才会被匹配到。
#################位置边界匹配#################
^: 表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$: 表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$: 表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作空行。
^abc$: 表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B: 匹配非单词边界,与\b正好相反。
#################分组与后向引用#################
\( \) 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套。
\(ab\) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。
2、扩展正则表达式
#################常用符号#################
. 表示任意一个字符。
* 表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身。
| 表示“或者”的意思,基础正则表达式不支持。
[ ] 表示匹配指定范围内的任意单个字符。
[^ ] 表示匹配指定范围外的任意单个字符。
#################单个字符匹配#################
此处基础正则表达式表示方法一致。
#################次数匹配####################
? 表示匹配其前面的字符0或1次
+ 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
{n} 表示前面的字符连续出现n次,将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。
{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
{n,} 表示之前的字符连续出现至少n次,才会被匹配到。
#################位置边界匹配####################
^: 表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$: 表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$: 表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$: 表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B: 匹配非单词边界,与\b正好相反。
####################分组与后向引用####################
( ) 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套。
(ab) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。
三、grep与正则表达式结合应用举例
准备一个测试文件regular_expression.txt,内容如下:
gooooooood
good
gud
goooood
gxyzxyzxyzd
hello world! this is a beautiful world
123456789
abc123
abc
ABCD
,.;'":
1、匹配g和d之间有一个字符的行;
grep g.d regular_expression.txt
2、匹配模式go*d的行;
3、匹配g和d之间包含任意字符串的行
4、过滤包含字符串abc或ABC的行
5、过滤a和c之间包含字符串“abcdefg”中一个字符的行。
6、过滤a和c之间不包含字符串“xyz”中任意一个字符的行。
7、分别过滤文件中包含字母、数字、空格、字母或数字、大写字母、小写字母、标点符号的行
8、过滤文件中不包含标点符号的行。
9、次数匹配(基础正则与扩展正则对比)

10、位置匹配
1)过滤以字符串abc开头的行
2)过滤以789结尾的行
3)过滤空行
4)过滤包含以w开头以d结尾的词的行
11、分组与后向引用
1)过滤g和d之间包含模式‘xyz’的行
2、过滤出机器的ip地址
3、使用后向引用将日期反向显示(年-月-日转换显示为日-月-年)
12、grep其他常用选项举例
-i :忽略大小写;
-v:反向选择,即显示不包含匹配文本的所有行;
-r:递归搜索,使用grep -nr ‘关键字’ /data/to/path可以递归搜索出目录下所有包含关键字的文件名,所在行数,即改行的内容,非常常用。
-o: 匹配搜索的字符串
-a :以文本文件方式搜索;
-c :计算找到的符合行的次数;
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)