正则表达式grepegrep的使用

正则表达式(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结尾中间任意两个字符

linux grep正则 grep用法详解:grep与正则表达式_字符串

[]:匹配指定范围内的任意单个字符,例如以r或o开头后面跟任意两个字符

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_02


[^]:匹配指定范围外的任意单个字符,例如以n开头后面不跟字母的单词

linux grep正则 grep用法详解:grep与正则表达式_字符串_03

、次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数

*:匹配任意长度 ,表示0次、1次或多次,匹配*前面的字符,例如以r开头t结尾,r后面可以没有o,也可以有多个o

linux grep正则 grep用法详解:grep与正则表达式_锚定_04

.*  :匹配任意长度任意字符,例如以r开头t结尾,中间匹配任意长度字符

linux grep正则 grep用法详解:grep与正则表达式_字符串_05

\?:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以s开头s结尾可以匹配a,0次或1次

linux grep正则 grep用法详解:grep与正则表达式_锚定_06

\+:匹配左侧的字符至少一次,表示一次或多次,例如以r开头,中间匹配o

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_07

\{m\}:m次,表示其左侧字符精确出现m次,例如,匹配s两次

linux grep正则 grep用法详解:grep与正则表达式_shell_08

\{m,n\}:匹配其左侧至少m次,至多n次,例如匹配s最少一次,最多2次

linux grep正则 grep用法详解:grep与正则表达式_锚定_09

\{0,n\}:至多匹配n次,例如以r开头,至多匹配o四次

linux grep正则 grep用法详解:grep与正则表达式_shell_10

\{m,\}:匹配至少m次,例如以r开头,匹配0至少2次

linux grep正则 grep用法详解:grep与正则表达式_锚定_11

3、位置锚定

^:锚定行首,^ PATTERN,例如查找以rp开头的行

linux grep正则 grep用法详解:grep与正则表达式_字符串_12

$:锚定行尾,PATTERN$,例如查找以in结尾的行

linux grep正则 grep用法详解:grep与正则表达式_shell_13

^ PATTERN $:用模式匹配整行内容,例如以r开头以in结尾

linux grep正则 grep用法详解:grep与正则表达式_锚定_14

单词锚定:由非特殊字符组成的字符串
\<:锚定词首,\<PATTERN,也可用\bPATTERN,例如查找以ro开头的词

linux grep正则 grep用法详解:grep与正则表达式_锚定_15

\>:锚定词尾,\> PATTERN,也可用PATTERN\b,例如查找以ar结尾的词

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_16

\< PATTERN\>:匹配PATTERN中间的整个单词,例如查找System

linux grep正则 grep用法详解:grep与正则表达式_正则表达式_17

分组:\(\)

注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,…),因此还可以被引用

引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式匹配到的内容

\2:引用,模式中自左而右,右第二个左括号以及与之对应的右括号中的模式匹配到的内容

例如:

linux grep正则 grep用法详解:grep与正则表达式_shell_18

  • 扩展正则表达式(egrep

egrep命令:

 egrep[OPTIONS] PATTERN [FILE...]


字符匹配:

.  :匹配任意单个字符,例如以n开头p结尾,中间匹配任意单个字符

linux grep正则 grep用法详解:grep与正则表达式_字符串_19

[]:匹配指定范围内的任意单个字符,例如查找包含a或A的行

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_20

[^]:匹配指定范围外的任意单个字符,例如查找不包含r,但以t结尾,中间跟任意两个字符的行

linux grep正则 grep用法详解:grep与正则表达式_shell_21

次数匹配:

*:匹配任意长度 ,表示0次、1次或多次,匹配其左侧的字符,例如以r开头t结尾,r后面可以没有o,也可以有多个o

linux grep正则 grep用法详解:grep与正则表达式_锚定_22

?:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以s开头s结尾可以匹配a,0次或1次

linux grep正则 grep用法详解:grep与正则表达式_锚定_23

+:匹配其前的字符0次或1次,表示其左侧字符可有可无,例如以o开头t结尾可以匹配o,0次或1次

linux grep正则 grep用法详解:grep与正则表达式_锚定_24

{m}:精确匹配m次,例如精确匹配o两次的行

linux grep正则 grep用法详解:grep与正则表达式_正则表达式_25

{m,n}:匹配其左侧至少m次,至多n次,例如匹配s最少2次,最多3次

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_26

{m,}: 匹配其左侧至少m次,例如匹配o最少2次

linux grep正则 grep用法详解:grep与正则表达式_锚定_27

{0,n}:匹配其左侧至多n次,例如匹配o最多3次

linux grep正则 grep用法详解:grep与正则表达式_字符串_28

位置锚定:

^:锚定行首,^ PATTERN,例如查找以s开头的行

linux grep正则 grep用法详解:grep与正则表达式_正则表达式_29

$:锚定行尾,PATTERN$,例如查找以bash结尾的行

linux grep正则 grep用法详解:grep与正则表达式_字符串_30

单词锚定:由非特殊字符组成的字符串
\<:锚定词首,\<PATTERN,也可用\b PATTERN,例如查找以ss或sh开头的词

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_31

\>:锚定词尾,PATTERN>\,也可用PATTERN\b,例如查找以sh结尾的词

linux grep正则 grep用法详解:grep与正则表达式_linux grep正则_32

分组:()

此处分组与基础正则表达式分组用法相同,例如

linux grep正则 grep用法详解:grep与正则表达式_字符串_33

或者:

a|b:a或者b,或者两侧的所有内容,例如

linux grep正则 grep用法详解:grep与正则表达式_正则表达式_34

经过上述说明,我们已经对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:]]*$"