什么是正则表达式?
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
正则表达式对Linux系统管理员工作有什么帮助?
通常情况下,由于系统在繁忙的情况下,每天产生的信息会多到你无法想象的地步,系统管理员需要每天去看很多的数据信息,从千百行的数据中找个出一行有问题的信息,难度太大!
这时,我们就可以通过正则表达式的功能,仅仅取出有问题的信息进行分析。如此,系统管理工作将会更加容易;
grep、egrep的常用的参数选选项:
选项 |
功能 |
备注 |
-v |
反向选取 |
|
-o |
仅显示匹配到的内容 |
|
-i |
匹配时忽略字符大小写 |
|
-E |
使用扩展正则表达式 |
|
-A # |
显示匹配到的行后#行 |
|
-B # |
示匹配到的行前#行 |
|
-C # |
显示匹配到的行前后#行 |
|
--color |
表示匹配的字符用颜色标记出来 |
grep基本正则表达式匹配方式可以细分为几大类:字符匹配、匹配次数、限定、位置锚定、分组符;
选项 |
功能 |
备注 |
字符匹配 |
||
. |
匹配任意单个字符 |
包括字母、数字、特殊字符 |
[] |
匹配指定集合中的任意单个字符 |
如:[q] 表示匹配字符q |
[^] |
匹配指定集合外的任意单个字符 |
如:[^q] 表示匹配字符q以外的字符 |
匹配次数(用于对其前面的紧邻的字符所能够出现的次数做出限定) |
||
* |
匹配其前面任意次,0,1或多次; |
|
\? |
匹配其前面的字符0次或一次; |
|
\{m\} |
匹配其前面的字符m次; |
|
\{m,n\} |
匹配其前面的字符至少m次,至多n次; |
另:\{1,\}表示1到无穷大都匹配 |
.* |
用于匹配任意长度的任意字符; |
此处的.*相当于windows中搜索时用到的* |
位置锚定: |
||
^ |
行首锚定(^R 表示R必须出现在行首); |
必须写在最左侧; |
$ |
行尾锚定; |
写在模式的最右侧; |
^$ |
空白行(行首锚定和行尾锚定组合); |
表示行首和行尾都没有任何字符; |
\< |
词首锚定,出现在要查找的单词模式的左侧; |
\<q 表示以Q开头的单词; |
\> |
词尾锚定,出现在要查找的单词模式的右侧; |
\>q 表示以Q结尾的单词; |
\<pattern\> |
匹配单词; |
\<root\> 表示查找文件中含有root的行; |
分组符: |
||
\(\) |
给某特定的值进行分组(不限于单词) |
\<root\> 表示查找文件中含有root的行; |
实际运用举例:
例:如我们需要寻找在/etc/passwd文件下含有以r开头的行可以用如下命令;
# grep –color ‘^[r]‘ /etc/passwd
由输出结果我们可以看出,grep命令会自动筛选出我们需要的条件行显示出来,隐藏我们不需要的信息;
初学者经常对命令不熟悉经常会闹笑话,比如我们同样寻找/etc/passwd文件下以root开头的行,很多初学者会写成这样: # grep –color ‘^[root]‘ /etc/passwd 看似没错.但是显示除的结果却不是我们需要的,下图是这条命令的输出结果:
我们能看到系统显示出了分别以‘r’‘o’‘t’为行首的行;
正确的书写格式如下;
# grep –color ‘^\(root\)‘ /etc/passwd
上图显示出的是我们需求的以‘root’开头的行。
我们也可以加上参数使其至显示我们匹配到的内容;
我在前的命令后面跟了一个‘-o’的参数,表示仅显示匹配到的内容。同时我们也可以‘-v’进行反向选取,就表示显示除‘root’开头的所有行:
egrep及扩展的正则表达
egrep大部分表达方式与grep一致,仅有部分匹配格式对grep进行了简化,这里仅列出不同的选项;
选项 |
功能 |
备注 |
匹配次数 |
||
? |
匹配其前面的字符0次或一次 |
在grep中需要写成:\? |
+ |
匹配其前面的字符至少一次 |
|
{m} |
匹配其前面的字符m次 |
在grep中需要写成:\{m\} |
{n,m} |
匹配其前面的字符至少n次,至多m次; |
在grep中需要写成:\{n,m\} |
分组 |
||
(xxx) |
对‘xxx’进行分组 |
在grep中需要写成:\(xxx\) |
或者 |
||
| |
可以进行模糊查找如找a或b或c |
‘(a|b|c)’ |
例;
我们分别使用egrep和grep进行查找/etc/passwd 文件下的出现root的行(要求至少匹配一次),并进行对比;
#grep --color ‘\(root\)\{1,\}’ /etc/passwd
#egrep --color ‘(root)+’ /etc/passwd
由上面的两段命令可以看出要显示同样的结果往往egrep比grep的书写方式更简单;
很多时候由于对命令不熟悉,我们经常回记错格式,会把扩展的正则表达式用在grep中,我们这里可以尝试一下看会出现什么情况:
这里没有显示任何内容,然后我们使用echo $?查看到反馈为’1’这说明我们的命令没有执行成; 那有没有办法直接用grep来使用扩展正则表达式呢?当然有,我们只需要在命令后面加上-E就可以了;我们来尝试一下;
这里有结果反馈,已经执行成功了!
正则表达式,你明白了吗?