基础篇
基础正则表达式:
^ 作用:匹配开头的行
例:#匹配以bin开头的行
grep '^bin' /ect/passwd
$作用:匹配以bash结尾的行
例:#匹配以shutdown结尾的行
grep 'shutdown$' /etc/passwd
* 作用:前一个字符匹配0或任意多次
例:#匹配全部内容,包含空白行
grep 'o*' /etc/passwd
# 匹配至少包含一个o的行
grep 'oo*' /etc/passwd
. 作用匹配出换行符外的任意一个字符
例:#匹配h和m这两个字母之间一定有两个字符的单词的行
grep ‘h..m’ /etc/passwd
[] 作用:匹配中括号中指定的任意一个字符,只匹配一个字符烦人行
例:#匹配任意一位数字的行
grep [0-9] /etc、passwd
\ 作用:转义符。用于取消讲特殊符号的含义取消
例:查找含有单引号的行
grep \' /etc/init.d/iptables
[^]作用: 匹配除中括号的字符以外的任意一个字符
例:[^0-9] 匹配任意一位非数字字符
grep [^0-9] /etc/passwd
\{n\} 作用:表示其前面的字符恰好出现n次
例:#匹配有3个w开头的行
grep 'w\{3\}' /etc.passwd
\{n,\}作用:表示其前面的字符出现不小于n次
例:# 匹配最少用连续三个数字开头的行
grep ‘^[0-9]\{3,\}’ /ect/passwd
\{n,m\} 作用:表示其前面的字符至少出现n次,最多出现m次
匹配r和t之间最少一个o最多两个o的单词的行
grep 'ro\{1,2}t' /etc/passwd
\(\) 作用:分组 小括号有特殊意义要用反斜线
注意:分组中的模式,在每次匹配过程中所匹配到的字符,(匹配的 字符可以被grep记忆保存到变量中,这些变量是\1,\2 "\1 ,\2 引用表示每个分组中的变量 ")
单词牟定:有非特殊字符组成的连续的字符串:
\< :牟定词首 ,也可用\b
+ 意义:重复『一个或一个以上』的前一个 RE 字符
范例:搜寻 (god) (good) (goood)... 等等的字串。 那个 o+ 代表『一个以上的 o 』所以,底下的运行成果会将第 1, 9, 13 行列出来。
egrep -n 'go+d' regular_express.txt
? 意义:『零个或一个』的前一个 RE 字符
范例:搜寻 (gd) (god) 这两个字串。 那个 o? 代表『空的或 1 个 o 』所以,上面的运行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^
egrep -n 'go?d' regular_express.txt
| 意义:用或( or )的方式找出数个字串
范例:搜寻 gd 或 good 这两个字串,注意,是『或』! 所以,第 1,9,14 这三行都可以被列印出来喔!那如果还想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
() 意义:找出『群组』字串
范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以, 我就可以将 la 与 oo 列於 ( ) 当中,并以 | 来分隔开来,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+ 意义:多个重复群组的判别
范例:将『AxyzxyzxyzxyzC』用 echo 叫出,然后再使用如下的方法搜寻一下!
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字串的意思~