首页 > 代码库 > grep, egrep, 基本正则表达式及扩展表达式;

grep, egrep, 基本正则表达式及扩展表达式;

什么是正则表达式?

       正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。

 

正则表达式对Linux系统管理员工作有什么帮助?

       通常情况下,由于系统在繁忙的情况下,每天产生的信息会多到你无法想象的地步,系统管理员需要每天去看很多的数据信息,从千百行的数据中找个出一行有问题的信息,难度太大!

       这时,我们就可以通过正则表达式的功能,仅仅取出有问题的信息进行分析。如此,系统管理工作将会更加容易;

 

grepegrep的常用的参数选选项:

选项

功能

备注

-v

反向选取


-o

仅显示匹配到的内容


-i

匹配时忽略字符大小写


-E

使用扩展正则表达式


-A #

显示匹配到的行后#


-B #

示匹配到的行前#


-C #

显示匹配到的行前后#


--color

表示匹配的字符用颜色标记出来


 

grep基本正则表达式匹配方式可以细分为几大类:字符匹配、匹配次数、限定、位置锚定、分组符;

选项

功能

备注

字符匹配

.

匹配任意单个字符

包括字母、数字、特殊字符

[]

匹配指定集合中的任意单个字符

如:[q] 表示匹配字符q

[^]

匹配指定集合外的任意单个字符

如:[^q] 表示匹配字符q以外的字符

匹配次数(用于对其前面的紧邻的字符所能够出现的次数做出限定)

*

匹配其前面任意次,01或多次;


\?

匹配其前面的字符0次或一次;


\{m\}

匹配其前面的字符m次;


\{mn\}

匹配其前面的字符至少m次,至多n次;

另:\{1\}表示1到无穷大都匹配

.*

用于匹配任意长度的任意字符;

此处的.*相当于windows中搜索时用到的*

位置锚定:

^

行首锚定(^R 表示R必须出现在行首);

必须写在最左侧;

$

行尾锚定;

写在模式的最右侧;

^$

空白行(行首锚定和行尾锚定组合);

 

表示行首和行尾都没有任何字符

\<

词首锚定,出现在要查找的单词模式的左侧;

\<q  表示以Q开头的单词;

\>

词尾锚定,出现在要查找的单词模式的右侧;

\>q  表示以Q结尾的单词;

\<pattern\>

匹配单词;

\<root\>  表示查找文件中含有root的行;

分组符:

\(\)

给某特定的值进行分组(不限于单词)

\<root\>  表示查找文件中含有root的行;

 

实际运用举例:

例:如我们需要寻找在/etc/passwd文件下含有以r开头的行可以用如下命令;

# grep  –color  ‘^[r]‘  /etc/passwd

wKiom1RoeyvwV3c_AADBbR0WZ1g650.jpg

由输出结果我们可以看出,grep命令会自动筛选出我们需要的条件行显示出来,隐藏我们不需要的信息;

初学者经常对命令不熟悉经常会闹笑话,比如我们同样寻找/etc/passwd文件下以root开头的行,很多初学者会写成这样: # grep  –color  ‘^[root]‘  /etc/passwd  看似没错.但是显示除的结果却不是我们需要的,下图是这条命令的输出结果:

wKioL1Roe66jeh62AAEnDKPkiBo414.jpg

我们能看到系统显示出了分别以‘r’‘o’‘t’为行首的行;

正确的书写格式如下;

# grep  –color  ‘^\(root\)‘  /etc/passwd

wKiom1Roe0nCDzUoAAByy4BCp8E825.jpg

上图显示出的是我们需求的以‘root’开头的行。

我们也可以加上参数使其至显示我们匹配到的内容;

wKioL1Roe8mxh3Q2AABAEr3MFqA926.jpg

我在前的命令后面跟了一个‘-o’的参数,表示仅显示匹配到的内容。同时我们也可以‘-v’进行反向选取,就表示显示除‘root’开头的所有行:

 

egrep及扩展的正则表达

       egrep大部分表达方式与grep一致,仅有部分匹配格式对grep进行了简化,这里仅列出不同的选项;

      

选项

功能

备注

匹配次数

匹配其前面的字符0次或一次

grep中需要写成:\?

+

匹配其前面的字符至少一次


{m}

匹配其前面的字符m

grep中需要写成:\{m\}

{nm}

匹配其前面的字符至少n次,至多m次;

grep中需要写成:\{n,m\}

分组

xxx

对‘xxx’进行分组

grep中需要写成:\(xxx\)

或者



|

可以进行模糊查找如找abc

 ‘(a|b|c)’

 

例;

       我们分别使用egrepgrep进行查找/etc/passwd 文件下的出现root的行(要求至少匹配一次),并进行对比;

       #grep  --color  ‘\(root\)\{1,\}’   /etc/passwd

wKiom1Roe2zA364aAACb2b4THtQ527.jpg

       #egrep   --color  ‘(root)+’  /etc/passwd

wKioL1Roe-rxc4tuAACUi0G_wMA303.jpg

由上面的两段命令可以看出要显示同样的结果往往egrepgrep的书写方式更简单;

很多时候由于对命令不熟悉,我们经常回记错格式,会把扩展的正则表达式用在grep,我们这里可以尝试一下看会出现什么情况:
       wKiom1Roe4ijV03yAABdAuAuCNI979.jpg

这里没有显示任何内容,然后我们使用echo $?查看到反馈为’1’这说明我们的命令没有执行成; 那有没有办法直接用grep来使用扩展正则表达式呢?当然有,我们只需要在命令后面加上-E就可以了;我们来尝试一下;

       wKioL1RofAeBENXtAACxAC_Pm-E156.jpg

这里有结果反馈,已经执行成功了!

 

正则表达式,你明白了吗?

 



grep, egrep, 基本正则表达式及扩展表达式;