什么是正则表达式?
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
正则表达式对Linux系统管理员工作有什么帮助?
通常情况下,由于系统在繁忙的情况下,每天产生的信息会多到你无法想象的地步,系统管理员需要每天去看很多的数据信息,从千百行的数据中找个出一行有问题的信息,难度太大!
这时,我们就可以通过正则表达式的功能,仅仅取出有问题的信息进行分析。如此,系统管理工作将会更加容易;
grep、egrep的常用的参数选选项:
功能 | 备注 | |
-v | 反向选取 | |
-o | 仅显示匹配到的内容 | |
-i | 匹配时忽略字符大小写 | |
-E | 使用扩展正则表达式 | |
-A # | 显示匹配到的行后#行 | |
-B # | 示匹配到的行前#行 | |
-C # | 显示匹配到的行前后#行 | |
--color | 表示匹配的字符用颜色标记出来 |
grep基本正则表达式匹配方式可以细分为几大类:字符匹配、匹配次数、限定、位置锚定、分组符;
选项 | 功能 | 备注 |
字符匹配 | ||
. | 匹配任意单个字符 | 包括字母、数字、特殊字符 |
[] | 匹配指定集合中的任意单个字符 | |
[^] | 匹配指定集合外的任意单个字符 | 如:[^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次或一次 | |
+ | 匹配其前面的字符至少一次 | |
{m} | 匹配其前面的字符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就可以了;我们来尝试一下;
这里有结果反馈,已经执行成功了!
正则表达式,你明白了吗?