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、基础正则表达式

bash 复制代码
#################常用符号#################
.     表示任意单个字符。
*     表示前面的字符连续出现任意次,包括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、扩展正则表达式

bash 复制代码
#################常用符号#################
.     表示任意一个字符。
*     表示前面的字符连续出现任意次,包括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 :计算找到的符合行的次数;

相关推荐
我星期八休息12 分钟前
网络编程—NAT、代理服务与内网穿透
linux·服务器·网络·网络协议
RisunJan42 分钟前
Linux命令-sysctl(运行时修改内核参数)
linux·网络·智能路由器
yunwei3742 分钟前
eBPF 教程:使用 fsession 追踪慢速 vfs_read 调用
linux·云原生
A_humble_scholar1 小时前
Linux 网络基础(三)下的 HTTP 核心详解:从请求响应到状态管
linux·网络·http
袅沫1 小时前
Nginx中部署多个前端项目——区分路径
服务器·前端
Albart5751 小时前
Docker Desktop最新版安装踩坑全记录(Windows_Mac_Linux)【2026 4.74.0 终版】
linux·windows·macos·docker·环境搭建·踩坑记录
fei_sun1 小时前
UVM中的TLM1.0通信
运维·服务器·uvm
MartinYeung51 小时前
[论文学习]MCPTox:面向真实世界MCP服务器的工具投毒攻击基准测试
运维·服务器·学习
举手2 小时前
Epoll模型
linux·c++·学习
Escalating_xu2 小时前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器