基础知识笔记之正则表达式
查找中间是字母的用户
[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\>右侧锚定单词
分组及引用
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理;
\(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 '\' 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"。(?