正则表达式grep和egrep的使用
正则表达式(REGular EXPression REGEXP)就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。正则表达式中的模式(pattern)以正则表达式的元字符,以及正常字符组合而成。
正则表达式的字符串依照不同的严谨度而分为基础正则表达式与扩展正则表达式。
一、基础正则表达式(grep)
Grep全称: Global search Regular expression and Print out theline.
Grep命令:
grep [OPTIONS] PATTERN [FILE...]
常用选项:
高亮显示匹配到的内容
-o:只显示被模式匹配到的内容
-i:ignore case,搜索时不区分字符大小写
1、字符匹配
. :匹配任意单个字符,例如 以r开头t结尾中间任意两个字符
[]:匹配指定范围内的任意单个字符,例如以r或o开头后面跟任意两个字符
[^]:匹配指定范围外的任意单个字符,例如以n开头后面不跟字母的单词
、次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数
*:匹配任意长度 ,表示0次、1次或多次,匹配*前面的字符,例如以r开头t结尾,r后面可以没有o,也可以有多个o
.* :匹配任意长度任意字符,例如以r开头t结尾,中间匹配任意长度字符
\?:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以s开头s结尾可以匹配a,0次或1次
\+:匹配左侧的字符至少一次,表示一次或多次,例如以r开头,中间匹配o
\{m\}:m次,表示其左侧字符精确出现m次,例如,匹配s两次
\{m,n\}:匹配其左侧至少m次,至多n次,例如匹配s最少一次,最多2次
\{0,n\}:至多匹配n次,例如以r开头,至多匹配o四次
\{m,\}:匹配至少m次,例如以r开头,匹配0至少2次
3、位置锚定
^:锚定行首,^ PATTERN,例如查找以rp开头的行
$:锚定行尾,PATTERN$,例如查找以in结尾的行
^ PATTERN $:用模式匹配整行内容,例如以r开头以in结尾
单词锚定:由非特殊字符组成的字符串
\<:锚定词首,\<PATTERN,也可用\bPATTERN,例如查找以ro开头的词
\>:锚定词尾,\> PATTERN,也可用PATTERN\b,例如查找以ar结尾的词
\< PATTERN\>:匹配PATTERN中间的整个单词,例如查找System
分组:\(\)
注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,…),因此还可以被引用
引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式匹配到的内容
\2:引用,模式中自左而右,右第二个左括号以及与之对应的右括号中的模式匹配到的内容
例如:
- 扩展正则表达式(egrep)
egrep命令:
egrep[OPTIONS] PATTERN [FILE...]
字符匹配:
. :匹配任意单个字符,例如以n开头p结尾,中间匹配任意单个字符
[]:匹配指定范围内的任意单个字符,例如查找包含a或A的行
[^]:匹配指定范围外的任意单个字符,例如查找不包含r,但以t结尾,中间跟任意两个字符的行
次数匹配:
*:匹配任意长度 ,表示0次、1次或多次,匹配其左侧的字符,例如以r开头t结尾,r后面可以没有o,也可以有多个o
?:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以s开头s结尾可以匹配a,0次或1次
+:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以o开头t结尾可以匹配o,0次或1次
{m}:精确匹配m次,例如精确匹配o两次的行
{m,n}:匹配其左侧至少m次,至多n次,例如匹配s最少2次,最多3次
{m,}: 匹配其左侧至少m次,例如匹配o最少2次
{0,n}:匹配其左侧至多n次,例如匹配o最多3次
位置锚定:
^:锚定行首,^ PATTERN,例如查找以s开头的行
$:锚定行尾,PATTERN$,例如查找以bash结尾的行
单词锚定:由非特殊字符组成的字符串
\<:锚定词首,\<PATTERN,也可用\b PATTERN,例如查找以ss或sh开头的词
\>:锚定词尾,PATTERN>\,也可用PATTERN\b,例如查找以sh结尾的词
分组:()
此处分组与基础正则表达式分组用法相同,例如
或者:
a|b:a或者b,或者两侧的所有内容,例如
经过上述说明,我们已经对grep和egrep有所了解,但是在实际的应用中,grep可以通过加-E使之与egrep拥有相同功能,即grep –E=egrep。
下面我们做几个练习题加深一下印象,分别使用grep和egrep实现:
1显示/proc/meminfo文件中以大小写或小写s开头的行;
#grep -i"^s" /proc/meminfo
#grep"^[sS]" /proc/meminfo
# egrep -i"^s" /etc/passwd
2显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
#grep -v "/sbin/nologin\>" /etc/passwd |cut –d: f1
# egrep -v"/sbin/nologin\>" /etc/passwd | cut -d: -f1
3显示/etc/passwd文件中其默认shell为/bin/bash的用户;
#grep"/bin/bash\>" /etc/passwd | cut –d: f1
# grep -E"/bin/bash\>" /etc/passwd | cut -d: -f1
#egrep “/bin/bash\b”/etc/passwd | cut –d: -f1
4找出/etc/passwd文件中的一位数或两位数;
#grep"\<[0-9]\{1,2\}\>" /etc/passwd
# egrep"\<[0-9]{1,2}\>" /etc/passwd
5显示/boot/grub/grub.conf中至少一个空白字符开头的行;
#grep"^[[:space:]]\+" /boot/grub/grub.conf
# egrep"^[[:space:]]+" /boot/grub/grub.conf
6显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
#grep "^#[[:space:]]\+[[:alnum:]]\+"/etc/rc.d/rc.sysinit
# egrep"^#[[:space:]][^[:space:]]" /etc/rc.d/rc.sysinit
7打出netstat –tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
#netstat-tan | grep"LISTEN[[:space:]]\+"
# netstat -tan |egrep "LISTEN[[:space:]]*$"