侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(22)之egrep与扩展正则表达式

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 620 阅读 / 4083 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

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 指的是匹配 Ccat,而不是 Catcat。如果管道符前后指定的是单个字符,可以通过分组括号来限定,例:(C|c)at

练习

1、显示当前系统 rootcentosuser1 用户默认的 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 命令旨在快速搜索,使用起来简单的多,它的功能也没有 grepegrep 强大,因为它不支持使用正则表达式或元字符来匹配内容,但它的工作性能是优于 grepegrep 的。
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 是匹配不到结果的。

0

评论区