正则表达式(basic regexp):包含了很多的元字符,元字符表达的不是本身的意义,而是某种通配的或是次数匹配的其他意义。

grep仅支持基本正则表达式

匹配字符的

. :匹配任意单个字符

grep "r..t" /etc/passwd

[]:指定范围内的任意单个字符

[Cc]at表示匹配以C或是c开头的at

[^]表示取反

 [^ab]表示匹配除了ab以外的其他单个字符

指定字符集的:

[[:upper:]]=[A-Z];[[:lower:]]=[a-z];[[:digit:]]=[0-9] [[:alpha:]]=[a-zA-Z] [[:alnum:]]=[a-zA-Z0-9]

[[:space:]]表示空格  [:punct:]表示所有的标点符号

匹配次数

* :匹配其前面的字符任意次

ab*c:abc abbc ac

.*:匹配以字符开头的后面任意长度的任意字符,也称为贪婪模式

grep  --color "r.*t" /etc/passwd

X\{m,n\} 表示x至少出现m次,至多出现n

X\{m,\}  表示x至少出现m次,至多不限

x\{0,n\} 表示至多出现n

例:查看/etc/passwd中至少包含了一个空白字符的行

grep [[space]]\{1,\}” /etc/passwd

?:匹配其前面的字符0次或1

ab?c的匹配结果是abc,ac

锚定符

行的锚定符

  ^:锚定行首

  ^r..t 表示以行首必须出现r..t

  $:锚定行尾

  ^$:锚定空白行

例:找出/etc/inittab中的空白行

grep “^$” /etc/inittab

词的锚定符

\<:锚定词首 也可以用\b来锚定词首

  \< r...t

\>:锚定词尾  也可以用\b来锚定词尾

  r..t\>

词组引用:

\(\):表示对字符进行分组,然后用\1\2进行后向引用

\(\(\)\):\1表示引用第一个括号中的内容,\2表示引用第二个括号中的内容

例子:

1.he love his lover

grep \(l..e\).*\1r ab.txt

找出/etc/inittab下以数字开头和以开头数字结尾的行

grep –color “^\([0-9]\).*\1$” /etc/inittab

这个例子中的^字符表示锚定行首,$表示锚定行尾。[0-9]表示数字

\1则表示引用行首的数字;.*则表示任意字符

查找当前系统上名字为user,名字后跟数字的用户的相关信息

grep “^user[0-9]\{1,\}\>” /etc/passwd

grep --color“^#[[:space:]]\{1,\}[^[:space:]]” /etc/inittab

grep 选项

 -v:对结果取反

例:找出/etc/inittab中的非空白行

grep –v “^$” /etc/inittab

 -i:忽略大小写

查找/etc/inittab下的大写c和小写c

grep –i “c”/etc/inittab

 -o:仅显示匹配到的字符串

 -E:支持扩展正则表达式

 -A n:表示显示匹配到的下面的n

 -B n:表示显示匹配到的上面的n

 -C n:表示显示匹配到的上下n

例:取出当前系统上以eth开头的网路设备的ip地址

ifconfig | grep –A 1 “eth” | grep –o “addr:[0-9]\{1,\}”

扩展的正则表达式(extended regexp

  扩展正则表达式基本上和正则表达式的元字符都大同小异,除了下面的元字符稍微有些不一样,其他的用法都是一样的,这里就不再说明了。

正则表达式中的           扩展正则表达式

\(\)                      ()另外还可以用作分组

     \m,n\                  {m,n}

 做次数匹配

  +:次数匹配,匹配其前的字符至少一次

下面是用正则表达式和扩展正则表达式表示/ect/inittab中的以#开头的包含至少一个空白字符,和非空白字符的行

grep --color“^#[[:space:]]\{1,\}[^[:space:]]” /etc/inittab

grep –color –E “^#[[:space:]]+[^[:space:]]” /etc/inittab

  |或者 a|b表示ab都行, (C|c)at

egrep命令和grep -E 表示后面是扩展正则表达式的元字符匹配

例:取出ifconfig命令结果中的1-255之间的位数

ifconfig | grep -E

 “\<([1-9]|[1-9][0-9])|1[0-9]{2}|2[0-5]{2})\>”

在这个例子中\<\>是锚定词首和词尾就是这个词开头和结尾都必须是数字,|表示扩展正则表达式中的或者 ,()表示分组,第一个[1-9]表示一位数;[1-9][0-9]表示两位数;1[0-9]{2}表示三位数,其中{2}表示匹配[0-9]两次;2[0-5]{2}表示小于255的三位数。