基础知识笔记之正则表达式

发布时间:2020-07-01 12:27:27 作者:027ryan
来源:网络 阅读:337

查找中间是字母的用户

[root@node01 ~]# grep "u[[:alpha:]][[:alpha:]]r" /etc/passwd

saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

user1:x:505:505::/home/user1:/bin/bash

user2:x:506:506::/home/user2:/bin/bash

[root@node01 ~]# grep "u[[:alpha:]][[:alpha:]]r" /etc/passwd

saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

user1:x:505:505::/home/user1:/bin/bash

user2:x:506:506::/home/user2:/bin/bash

[root@node01 ~]# 



基本正则表达式元字符:

字符匹配:

.:匹配任意单个字符

[]:匹配指定范围內的任意单个字符

[^]:匹配指定范围外的任意单个字符

[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:punct:]、[:space:]


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


*:匹配其前面的字符任意次;0,1,多次

例如:grep "x*y"

    abxy

    aby

    xxxxxy

    yab

.*:匹配任意长度的任意字符

\?:匹配其前面的字符0次或者1次;即其前面的字符是可有可无的;

\+:匹配其前面的字符1次或者多次;即其前面的字符至少要出现一次;

\{m\}:匹配前面字符m次;

\{m,n\}:匹配其前面的字符至少m次,至多n次;

\{0,n\}:至多匹配n次

\{m,\}:至少m次


位置锚定:

^:行首锚定;用于模式的最左侧;

$:行尾锚定;用于模式的最右侧;

^word$:用word匹配整行

^$:空白行

^[[:space:]]*$:表示只能出现空白行,space可以出现任意次,不管有没有如果有也只能出现空白;

即空白行或者包含空白字符的行

单词:非特殊字符祖册的连续字符(字符串)都称为单词;

\<或者\b:词首锚定,用于单词模式的左侧;

\>或者\b:词尾锚定,用于单词模式的右侧;

\<word\>:精确匹配完整单词

        \<word\>:精确锚定单词

        \<word左侧锚定单词

         word\>右侧锚定单词


分组及引用

\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理;

\(xy\)*ab:将xy当做一个整体来处理

提示:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

\1:模式从左侧其,第一个左括号以及与之匹配的右侧括号之间的模式所匹配的字符;

\2:模式从左侧其,第二个左括号以及与之匹配的右侧括号之间的模式所匹配的字符;

\3:模式从左侧其,第三个左括号以及与之匹配的右侧括号之间的模式所匹配的字符;



行首和行中间都出现r..t的字符窜,即grep的后向引用;引用前面的分组括号中的模式所匹配到的字符

[root@node01 ~]# grep "^\(r..t\).*\1" /etc/passwd

root:x:0:0:root:/root:/bin/bash

[root@node01 ~]# 




egrep:

 支持扩展的正则表达式实现类似于grep文本过滤功能:grep -E



生成补丁

diff oldfile   newfile >patchfile

 -u:使用unfiled机制,即显示要修改文件的上下文,默认为3行


patch:向文件打补丁

path [option] -i patchfile oldfile

或者

patch oldfile < patchfile


关于grep和egrep用法例子:

grep:

格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 
需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.
grep '\<Tom\>' file   包含单词Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy开头的行
grep '\.bak$' file 包含以.bak结束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
grep '[A-Z]' file 包含至少一个大写字母的行
grep '[0-9]' file 包含至少一个数字的行
grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w '[tT]est' file 包含单词和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
grep -n tom file   打印匹配的行并追加行号.
grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep '$name' file 打印包含字符$name的行.


egrep:

egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
扩展表达式:
+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间.
egrep '^+' file   以一个或者多个空格开头的行.
grep '^*' file   同上
egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep '(ab)+' file 包含至少一个ab的行.
egrep 'x[0-9]?' file 包含x或者x后面跟着0个或者多个数字的行.
egrep 'fun\.$' * 所有文件里面以fun.结尾的行.
egrep '[A-Z]+' file 至少包含一个大写字母的行.
egrep '[0-9]' file 至少一个数字的行.
egrep '[A-Z]...[0-9]' file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep '[tT]est' file 包含单词test或Test的行.
egrep 'ken sun' file 包含ken sun的行.
egrep -v 'marry' file 不包含marry的行.
egrep -i 'sam' file 不考虑sam的大小写,含有sam的行.
egrep -l "dear ken" * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s "$name" file 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 
1表示表达式没找到符合要求的, 2表示文件没找到.

 

在正则下

\ 关闭后续字符的特殊定义,但 \{\}会打开其特殊定义
. 任何单个字符
* 0个或多个 在它之前的单个字符  单独出现时 在BRE中不具有任何意义(因为前面为空
就什么都没有)
^ 在BRE中 在表达式开头处具有意义
在ERE中任何位置都有意义
$ 同上,只是他代表的是结尾处
[] 匹配方括号内任一字符   
- 在这里的意思是连续 ex:1-9  1到9
^ 代表非在方括号表达式中,所有的meta字符都会失去特殊含义
[]*\.-]这个例子比较特殊 对] 跟-  放进[]里的位置有些许讲究
[′"].*\1 这个的意思是 ''或者“”,不用担心单引号先找到或者是双引号先找到
 注:BRE 基础正则表达式 ERE 扩展正则表达式
 注:
 [::] 字符集ex: 
 [:alpha:] 字母字符 
 [:alnum:] 数字字符
 [:upper:] 大写 
 [:lower:] 小写 
 [:space:] 空格(和'\t')
  [..] 多字符序列视为一个单位
  [==]等价字符集 对于有音标的才需要后向引用  
  配一个\n 
  ex:\1 表示引用前面的一次,那就是() ()  原来有一次,再应用一次
  另外注意的是,n代表1-9 最多可以9次的应用,顺序是从左开始


元字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后
的位置。
$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前
的位置。
*匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。
+等价于{1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。
?等价于{0,1}。
{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配
“food”中的两个o。
{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配
“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配
“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o?”将匹配所有“o”。
.点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”
的模式。
(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript
中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“”或“”。
(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个
比“industry|industries”更简略的表达式。
(?=pattern)正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取
匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配
“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,
也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查
的字符之后开始。
(?<=pattern)反向肯定预查,与正向肯定预查类似,只是方向相反。
例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配
“3.1Windows”中的“Windows”。
(?<!pattern)反向否定预查,与正向否定预查类似,只是方向相反。
例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配
“2000Windows”中的“Windows”。
x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配
“zood”或“food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配
“plain”中的“a”。
[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的
任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不
在“a”到“z”范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中
的“er”,但不能匹配“verb”中的“er”。
\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。
否则,将c视为一个原义的“c”字符。
\d匹配一个数字字符。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]。
\f匹配一个换页符。等价于\x0c和\cL。
\n匹配一个换行符。等价于\x0a和\cJ。
\r匹配一个回车符。等价于\x0d和\cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t匹配一个制表符。等价于\x09和\cI。
\v匹配一个垂直制表符。等价于\x0b和\cK。
\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”
匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。
\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的
相同字符。
\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。
否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。
如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为
八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号()。


推荐阅读:
  1. 学习笔记-《Linux基础知识之挂载详解(mount,umo
  2. PHP学习笔记(五)--基础知识之语言结构语句

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

正则 表达式

上一篇:golang对mongodb的基本操作

下一篇:DVWA(V1.10)中Command Injection的high等级绕过

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》