egrep
前面有说过,egrep
其实就相当于 grep -E
,它的使用也和 grep
相似,因为它和 grep
命令共用一个 man
文档,它与 grep
命令不同的是它支持扩展的正则表达式。
扩展正则表达式的元字符
字符匹配:
.
:匹配任意单个字符;[]
:匹配指定范围内的单个字符;[^]
:匹配指定范围之外的单个字符;
匹配次数:
*
:仅表示次数,表示前面的字符可以出现任何次数;.*
:任意长度的任意字符;?
:前面的字符可以出现 0 次或 1 次;+
:前面字符至少出现 1 次;{m}
:匹配前面的字符 m 次;{m,n}
:匹配前面的字符至少 m 次,至多 n 次;
使用
egrep
时上述元字符都不用使用斜杠进行转义。
位置锚定:
^
:行首锚定,出现在模式的最左侧;$
:行尾锚定,出现在模式的最右侧;^$
:匹配空行;\<
或\b
:词首锚定,表示匹配字符必须出现正在单词的首部,用于单词模式的左侧;\>
或\b
:词尾锚定,表示匹配字符必须出现在单词的尾部,用于单词模式的右侧;\<PATTERN\>
:匹配整个单词;
分组:
()
:将一个或多个字符当做一个整体进行处理;
使用
egrep
分组的括号也不用转义,并且它也拥有后向引用的功能。
分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为\1
、\2
、\3
... 、\n
。\n
表示从左侧起,第n
个左括号以及与之匹配的右括号之间的模式所匹配到的字符。
或者:
|
:通过管道符能表示匹配管道符前的字符或管道符后的字符内容;
例:C|cat
指的是匹配 C
或 cat
,而不是 Cat
或 cat
。如果管道符前后指定的是单个字符,可以通过分组括号来限定,例:(C|c)at
。
练习
1、显示当前系统 root
、centos
和 user1
用户默认的 shell 和 UID。
[root@localhost ~]# egrep '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
user1:1004:/bin/bash
centos:1005:/bin/bash
2、找出 /etc/rc.d/init.d/functions
文件(CentOS 6 中才存在该文件)中某单词后面跟一对小括号的行。
[root@zze ~]# egrep '\<[_[:alnum:]]+\>\(\)' /etc/rc.d/init.d/functions -o
fstab_decode_str()
checkpid()
__readlink()
__fgrep()
__kill_pids_term_kill_checkpids()
__kill_pids_term_kill()
...
3、使用 echo
输出一路经,使用 egrep
来取出其基名和目录名。
基名:以路径
/etc/a/b
为例,该路径的基名为b
,即路径中最后一级文件或目录名,基名可通过basename <PATH>
命令来取得。
目录名:与基名对应的还有目录名,依旧以/etc/a/b
为例,目录名表示最后一级文件或目录的上级目录全路径,所以/etc/a/b
的目录名就是/etc/a
,目录名同样可以通过dirname <PATH>
来取得。
取基名:
[root@localhost ~]# echo '/etc/a/b/' | egrep '[^/]+/?$' -o | cut -d/ -f1
b
取目录名:
[root@localhost ~]# echo '/etc/a/b/' | egrep '^/.*[^/]' -o | egrep '^/.*/' -o | egrep '^/.*[^/]' -o
/etc/a
4、找出 ifconfig
命令结果中 1-255
之间的数值并去重按数值大小排序。
[root@localhost ~]# ifconfig | egrep '\<[0-9]\>|\<[0-9][0-9]\>|\<[0-1][0-9][0-9]\>|\<[0-2][0-4][0-9]\>|\<[0-2]5[0-5]\>' -o | sort -un
0
1
02
4
8
9
17
...
5、找出 ifconfig
命令结果中的 IP 地址。
[root@localhost ~]# ifconfig | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o
172.17.0.1
255.255.0.0
0.0.0.0
192.168.202.137
255.255.255.0
192.168.202.255
127.0.0.1
255.0.0.0
fgrep
fgrep
命令旨在快速搜索,使用起来简单的多,它的功能也没有 grep
和egrep
强大,因为它不支持使用正则表达式或元字符来匹配内容,但它的工作性能是优于 grep
和 egrep
的。
fgrep
只能按指定的文本原模式来匹配内容,例:
[root@localhost ~]# fgrep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]# fgrep r..t /etc/passwd
使用 fgrep r..t /etc/passwd
是匹配不到结果的。
评论区