加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:10:46 所属栏目:百科 来源:网络整理
导读:在Linux 的文本处理中存在着文本处理三剑客,分别是 grep:基于pattern对给定模式文本进行搜索操作; sed:一个非交互式文本流行编辑器 awk:GNU/awk,文本格式化工具,文本报告生成器,让文本更加美观; 三剑客需要模式匹配,而正则表达式正是模式匹配的强大工

在Linux 的文本处理中存在着文本处理三剑客,分别是

grep:基于pattern对给定模式文本进行搜索操作;

sed:一个非交互式文本流行编辑器

awk:GNU/awk,文本格式化工具,文本报告生成器,让文本更加美观;

三剑客需要模式匹配,而正则表达式正是模式匹配的强大工具,正则表达式非常重要了。

一、正则表达式(REGular EXpression,REGEX):由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字面意义,而是用于表示控制或通配的功能。正则表达式中处理软件是正则表达式引擎,它是利用正则表达式进行模式分析给定文本的程序;

正则表达式分类:

1.标准正则表达式

2.扩展正则表达式


二、grep 家族:

grep:Global search REgular Expression and Print out line.默认支持使用基本正则。

egrep:支持使用扩展正则表达式

fgrep:不支持使用正则表达式;也叫做快速正则

grep 用法:

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

选项:

--color=auto:对匹配的文本高亮显示

-i:忽略字符大小写;

#grep--color=auto"set"/tmp/mode/inittab
multi-user.target:analogoustorunlevel3
graphical.target:analogoustorunlevel5
Toviewcurrentdefaulttarget,run:
Tosetadefaulttarget,run:
systemctlset-defaultTARGET.target


-o:仅显示匹配的文本自身;

#tail/tmp/mode/inittab|grep-o--color=auto"&;.e.&;"
get
get
set
#tail/tmp/mode/inittab|grep--color=auto"&;.e.&;"
systemctlget-default
Tosetadefaulttarget,SimKai;"> -v,--invert-match:反向匹配;

[root@localhostmode]#tail-4/tmp/mode/inittab

Tosetadefaulttarget,run:
systemctlset-defaultTARGET.target
[root@localhostmode]#tail-4/tmp/mode/inittab|grep-vsystemctl

Tosetadefaulttarget,run:

-E:使用扩展正则表达式
-q,--quiet:静默模式,没有输出

添加新的pattern
-e PATTERN:添加另外的模式匹配;

#tail-4/tmp/mode/inittab|grepsystemctl
systemctlset-defaultTARGET.target
#tail-4/tmp/mode/inittab|grep-esystemctl-eset
Tosetadefaulttarget,SimKai;"> -f PAT_FILE: PAT_FILE 为每行一个pattern的文件,每行一个匹配模式即可,通-e。
选择正则
-E,--extended-regexp:egrep
-F,--fixed-strings,--fixed-regexp:支持固定字符串,fgrep
-G,--basic-regexp:支持使用基本正则表达式;
-P,--perl-regexp:支持pcre正则表达式

多显示几行
-A NUM,--after-context=NUM
-B NUM,--before-context=NUM
-C NUM,-NUM,--context=NUM

#tail-4/tmp/mode/inittab|grep-C3systemctl

Tosetadefaulttarget,SimKai;">三、基本正则表达式元字符

字符匹配:
.: 匹配单个字符
[]:匹配范围内的任意单个字符
[^]:匹配范围外的任意单个字符
常见范围: [:digit:],[:lower:],[:upper:],[:alpha:],[:space:],[:blank:],[:punct:],
说明:详情可以参看From man 7 glob

#catgrep.txt
abbb2
a2bb2
a3*c4
b3*b4
#grep"a[^[:digit:]].b[0-9]"grep.txt
abbb2

匹配次数:

用在要指定其出现的次数的字符后面,限制其字符匹配次数,默认在贪婪模式;

*:任意匹配,0 or 0+
+:匹配字符1+次,+在基本正则是特殊字符,要加反斜线:x+y== xy,xxy,xxxy
?:匹配其字符0 or 1 次; 要加反斜线转义
{m}:匹配其字符m次,m非负。 grep x{2}y,包含xxy 就可以
{m,n}:匹配其字符至少m次,m非负,至多n 次数;
{m,n}:匹配其字符至少m次,m非负,至多n 次数,包含m,n;
{m,}:匹配其字符至少m次,m非负;
特殊pattern: ".*" 配任意字符串

ifconfig|grep"[1-2]{0,1}[1-9]"
eno16777736:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500
inet172.18.29.100netmask255.255.0.0broadcast172.18.255.255
inet6fe80::20c:29ff:fe41:e1baprefixlen64scopeid0x20<link>
ether00:0c:29:41:e1:batxqueuelen1000(Ethernet)
RXpackets61748bytes7568786(7.2MiB)
RXerrors0dropped305overruns0frame0
TXpackets4605bytes583974(570.2KiB)

位置锚定:

限制使用模式搜索文本,限制模式匹配的文本只能出现在文本的那个位置。

^:行首锚定;用户模式的最左侧,^PATTERN
$:行尾锚定;用户模式的最左侧,PATTERN$
特殊"^pattern$" 完全匹配一整行
特殊"^$" 匹配空行
特殊"^[[:space:]]*$" 完全匹配空白行

[root@localhostmode]#ifconfig|grep"^e"
eno16777736:flags=4163<UP,MULTICAST>mtu1500

词首尾锚定:

单词:由非特殊字符组成的连续字符(字符串)为单词;ft/p包含两个单词 fp 和 p 两个词
词首部锚定: &;或 b:词首锚定,用于单词模式的左侧,格式为:&;PATTERN,bPATTERN
词尾部锚定:&;或 b:词首锚定,用于单词模式的左侧,格式为:&;PATTERN,bPATTERN
词锚定: &;PATTERN&;

[root@localhostmode]#ifconfig|grep"&;[1-2]+[0-9]&;"
inet172.18.29.100netmask255.255.0.0broadcast172.18.255.255
ether00:0c:29:41:e1:batxqueuelen1000(Ethernet)
inet127.0.0.1netmask255.0.0.0
inet6::1prefixlen128scopeid0x10<host>
inet192.168.122.1netmask255.255.255.0broadcast192.168.122.255

分组和引用:

(PATTERN):将PATTERN匹配的字符当作一个不可分割的整体。
说明:分组括号中的模式匹配到的字符会被正则表达式自动记录到内部的变量中,这些变量是1,2,3;
例如:pat1(pat2)pat3(pat4(pat5)pat6)
1:第一组括号中左括号到对应右括号匹配到的字符串,pat1
2:模式中的第2个左括号和与之匹配的右括号之间的模式匹配到的字符串 pat4(pat5)pat6

#catgrep.txt
helikehisliker
heloverhislover
helikehislover
helovehieliker
#grep"(l..e).*1r"grep.txt
helikehisliker
heloverhislover

四、egrep:扩展正则和基本正则同样有下列元字符,差异也比较很小,主要是特殊字符的不必再转义:
支持使用扩展正则表达式的grep命令,等于grep -E;扩展正则表达式的元字符:
字符匹配:
.: 匹配单个字符
[]:匹配范围内的任意单个字符
[^]:匹配范围外的任意单个字符
匹配次数:
*:0+次匹配
?:0 or 1 次匹配

+:1+次匹配
{m}:m次匹配
{m,n}:i次匹配,
位置锚定

^:行首锚定
$:行尾锚定
&;,b:词首锚定

&;,b:词尾锚定

(pattern):分组,括号中模式匹配到的字符串记录于正则表达式引擎的内部变量中
或者:

a|b:a或者b
C|cat:表示C或cat,#或者的是cat--整个右侧,同(C|c)at 不一样。

#echo"catisCat"|grep"C|cat"
catisCat
#echo"catisCat"|grep"(C|c)at"
catisCat

正则表达式就这么多,比较容易混,所以多看看,多记记。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读