上周讲了一个非常重要的内容,老师反复叮嘱一定要先写关于这个的博客,那么我们就先讲一下文本编辑工具里面的grep系及正则表达式元字符的使用,首先先讲一下什么是grep系
grep系:grep、egrep、fgrep
其中最主要的还是grep
grep:Global search Regular Expression and Print out the line
利用正则表达式进行全局查找并将匹配的行显示出来;
如果想要理解这句话我觉得最好我们先看一下什么是正则表达式的元字符,我们用PATTERN来表示
字符匹配类:
.:表示匹配任意单个字符
例:.abcd就是指的是以任意字符开头后面是abcd的所有结果比如1abcd等
[]:匹配指定范围内的任意单个字符
例:配合字符集使用,比如[:lower:]表示的就是匹配小写字母中的任意一个字母
[^]:匹配指定范围以外的任意单个字符
这个应该不用举例,和上一个相反就对了
下列所有的字符集都可以放在中括号里面用于匹配单个字符
[:lower:]:
[:upper:]:
[:alpha:]:
[:digit:]:
[:space:]:
[:alnum:]:
[:punct:]:
[:blank:]:
[:xdigit:]:所有的十六进制数字;
a-z:所有的小写字符
A-Z:所有的大写字母
0-9:标识所有的十进制字符
注意:这里的a-z指的就是所有的小写字母,不再是之前所说的a,A,b,...,z
*:其前面的字符可以出现任意次(0次、一次、多次)
例:a*bc就表示,bc前面可以出现任意次a,可以是0次,可以是1次,也可以是多次
\?:其前面的字符可有可无(0次或1次)
例:a\?bc就表示,bc前面只可以出现0次或1次a,注意:在?前加转义字符\是为了防止shell把?当作bash变量来处理,后面的\也是如此
\+:其前面的字符至少出现一次(1次或多次)
例:a\+bc就表示,bc前面至少出现一次a,也可以是多次
\{m\}:其前面的字符必须出现m次
例:a\{m\}bc表示,bc前面必须出现m次a
\{m,n\}:其前面的字符至少出现m次,至多出现n次
例:a\{m,n\}bc表示bc前面最少出现m次a,最多出现n次a
\{,n\}:其前面的字符至多出现n次
例:a\{,n\}bc表示bc前面最多可以出现n次a
\{m,\}:其前面的字符至少出现m次,多多益善
例:a\{m,\}bc表示bc前面至少出现m次a
在正则表达式中,表示任意长度任意字符的方式:.*
例:.*abc就表示只要是以abc结尾,前面可以是任意长度任意字符的东西
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\<或\b
字尾锚定:\>或\b
\b:旧版本中的锚定方法,建议不使用
关于行首锚定和字锚定我们在后面的例题中再详细解释
在正则表达式中,字是由非特殊字符组成的连续字符串。
分组与引用字符:
\(PATTERN\):将PATTERN匹配到的所有字符当作一个不可分割的整体来处理
分组很好理解,就是把由一串字符组成的东西当作一个整体在计算机中寻找匹配
在正则表达式引擎当中,有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后向引用,这些变量依次是\1,\2,\3...
PATTERN1\(PATTERN2\)PATTERN3\(PATTERN4\(PATERN5\))
\1:PATTERN2
\2:PATTERN4
\3:PATTERN5
\1:第一组小括号中PATTERN匹配到的字符
\2:第二组小括号中PATTERN匹配到的字符
\3:第三组小括号中PATTERN匹配到的字符
关于引用,最简单的解释就是你之前已经使用过的字符串在后面的表达式中如果再用到的话,你可以不打出来,而只用一个符号来代替,第一个出现的就用\1表示,第二个字符就用\2表示,依次类推
例:请找出在/etc/passwd 中用户的UID和GID相同的用户账户;
首先我们来分析一下,用户的UID和GID都是一串数字,所有我们想到可以用数字字符集来匹配,然后再来分析用户的UID和GID一般都是由几个数字组成,所以我们可以用\+来实现,然后要求GID和UID一样我们只需表示出GID,直接饮用表示UID就可以了,所以具体的命令格式应该是下面这种格式。
grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
或:
\|
注意:或字符将其两边的字符串当作整体对待;
A\|american:A或american
怎么理解把两边的字符串当作整体来对待,就是比如上面这个例子A\|american表示A或american而不是A或a,然后接上merican
我们再来看一个例子:
请找出ifconfig执行结果中数值在100-255之间的整数;
第一位:1 2
第二位:0-9 0-4 5
第三位:0-9 0-9 0-5
这个问题难点不在PATTENR的表示,在于分析这个整数的特点,只要分析明白了,这个问题就很好解决
ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\25[0-5]\)\>'
说完正则表达式的元字符,我们接着来说grep系的具体用法
grep [OPTIONS] PATTERN [FILE...]
PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成
正则表达式的元字符:
会被正则表达式的引擎解释为特殊含义;
pcre--perl语言的正则表达式引擎;
基本的正则表达式:BRE
扩展的正则表达式:ERE
grep默认仅支持基本正则表达式;
egrep默认支持扩展正则表达式;
fgrep默认不开启正则表达式引擎;
文本字符:
只具备字符表面含义的那些字符;
常用选项:
-i --ignore-case 忽略文本字符的大小写
-v --invert-match 反向匹配,最终显示的结果是PATTERN不能成功匹配的行
-c --count 计数,统计匹配PATTERN的所有行数
-o,--only-matching 关闭贪婪模式,仅显示PATTERN匹配的内容
-q,--quiet,--silent 安静模式,不输出任何匹配结果,用于逻辑判断
--color[=WHEN],--colour[=WHEN]:将匹配PATTERN的字符以特殊颜色高亮显示
--color+auto
-E,--extended-regexp 扩展的正则表达式,grep -E相当于egrep
-F,--fixed-strings,--fixed-regexp 基本的正则表达式,egrep -F 相当于fgrep
-G,--basic-regexp:基本的正则表达式 egrep -G相当于grep
-P,--perl-regexp:使用PCRE引擎
-A NUM,--after-context=NUM:在显示匹配PATTERN的行的同时显示其后面的NUM行
-B NUM,--before-context=NUM:在显示匹配PATTERN的行的同时显示其前面的NUM行
-C NUM,-NUM,--context=NUM:在显示匹配PATTERN的行的同时显示其前后的NUM行
关于grep的用法其实和命令的学习是差不多的,就是先记得滚瓜烂熟再配合操作巩固就好了,接下来说egrep和fgrep就很好理解了,egrep相对于grep的区别就是在使用正则表达式元字符的时候可以不用转义字符
egrep:
egrep [OPTIONS] PATTERN [FILE...]
扩展的正则表达式元字符:
字符匹配:
.
[]
[^]
次数匹配:
*
?
+
{}
{m,n}
{m,}
{,n}
位置锚定字符
^
$
\<,\b
\>,\b
分组和引用
()
\1,\2,\3
或:
|
fgrep:PATTERN中所有的字符都被当作文本字符来处理
关于fgrep,只是把PATTENR解释为纯文本,不再用正则表达式对其进行解释,有利用提高搜索的速度
关于grep系和正则表达式元字符就介绍到这,这是很重要的文件处理只是,大家必须好好理解,吸收掌握。