正则表达式grepegrep的使用

正则表达式(REGular EXPression REGEXP)就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。正则表达式中的模式(pattern)以正则表达式的元字符,以及正常字符组合而成。

正则表达式的字符串依照不同的严谨度而分为基础正则表达式与扩展正则表达式。

一、基础正则表达式(grep

Grep全称: Global search Regular expression and Print out theline.

Grep命令:

     grep [OPTIONS] PATTERN [FILE...]

  Grep常用选项:

   --color=auto|always|never:高亮显示匹配到的内容

-o:只显示被模式匹配到的内容

-i:ignore case,搜索时不区分字符大小写   

1、字符匹配

. :匹配任意单个字符,例如 r开头t结尾中间任意两个字符

正则表达式grep和egrep的基本使用_search

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

正则表达式grep和egrep的基本使用_特殊符号_02


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

正则表达式grep和egrep的基本使用_search_03

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

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

正则表达式grep和egrep的基本使用_特殊符号_04

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

正则表达式grep和egrep的基本使用_expression_05

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

正则表达式grep和egrep的基本使用_expression_06

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

正则表达式grep和egrep的基本使用_特殊符号_07

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

正则表达式grep和egrep的基本使用_expression_08

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

正则表达式grep和egrep的基本使用_search_09

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

正则表达式grep和egrep的基本使用_search_10

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

正则表达式grep和egrep的基本使用_特殊符号_11

3、位置锚定

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

正则表达式grep和egrep的基本使用_expression_12

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

正则表达式grep和egrep的基本使用_expression_13

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

正则表达式grep和egrep的基本使用_expression_14

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

正则表达式grep和egrep的基本使用_expression_15

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

正则表达式grep和egrep的基本使用_expression_16

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

正则表达式grep和egrep的基本使用_特殊符号_17

分组:\(\)

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

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

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

例如:

正则表达式grep和egrep的基本使用_特殊符号_18

  • 扩展正则表达式(egrep

egrep命令:

 egrep[OPTIONS] PATTERN [FILE...]

 

字符匹配:

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

正则表达式grep和egrep的基本使用_特殊符号_19

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

正则表达式grep和egrep的基本使用_expression_20

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

正则表达式grep和egrep的基本使用_expression_21

次数匹配:

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

正则表达式grep和egrep的基本使用_特殊符号_22

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

正则表达式grep和egrep的基本使用_search_23

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

正则表达式grep和egrep的基本使用_特殊符号_24

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

正则表达式grep和egrep的基本使用_search_25

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

正则表达式grep和egrep的基本使用_search_26

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

正则表达式grep和egrep的基本使用_特殊符号_27

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

正则表达式grep和egrep的基本使用_特殊符号_28

位置锚定:

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

正则表达式grep和egrep的基本使用_expression_29

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

正则表达式grep和egrep的基本使用_expression_30

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

正则表达式grep和egrep的基本使用_search_31

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

正则表达式grep和egrep的基本使用_特殊符号_32

分组:()

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

正则表达式grep和egrep的基本使用_search_33

或者:

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

正则表达式grep和egrep的基本使用_expression_34

经过上述说明,我们已经对grepegrep有所了解,但是在实际的应用中,grep可以通过加-E使之与egrep拥有相同功能,即grep –E=egrep

下面我们做几个练习题加深一下印象,分别使用grepegrep实现:

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:]]*$"