正则表达式是文本三剑客中及其重要的一环,称之为灵魂也不为过,到底什么是正则表达式呢,让我们一起来了解以下!
格式:
- grep -参数 "条件" 文件名
-
- 参数:
- -i 忽略大小写
- -c 统计匹配的行数
- -v 取反,不显示匹配的行
- -w 匹配单词
- -E 等价于egrep,即启用扩展正则表达式
- -n 显示行号
- -rl 将指定目录内的文件打印
- -A数字 匹配行及以下n行
- -B数字 匹配行及以上n行
- -C数字 匹配行及上下n行
- -q 静默模式,没有任何内容输出,使用$?来判断是
- 否执行成功
- -o 只显示匹配的内容
案列:

案例:检索不能登录的账号名
- [root@server ~]# grep -n "/sbin/nologin" /etc/passwd
- #检索能登录的使用grep -vn
[root@timeserver ~]# grep -nB5 "sshd" /etc/passwd

[root@timeserver ~]# df -h | grep "/"

- #grep是能进行模糊匹配,精确匹配需要使用-w
- [root@timeserver ~]# df -h | grep -w "/"

- #-o参数只显示匹配的内容
- [root@timeserver ~]# df -h | grep -wo "/"
- /
| 元字符 | 作用 |
| .(点号) | 匹配任意一个字符 |
| * | 匹配前面的字符0次或多次 |
| {m,n} | 将前一项字符重复匹配m-n次 |
| ? | 匹配前一个字符出现0次或1次。 |
| ^ | 匹配字符串的开头。 |
| $ | 匹配字符串的结尾。 |
| [] | 匹配字符[]集中的任意一个字符 |
| [^] | 匹配除字符集中的任意一个字符以外的字符。^[]:以...开头 |
| () | 表示一个子表达式,可以用于分组、捕获或引用。 |
| 词首【\或\b】 和词尾锚定【\>或者\b】 | 用于界定边界,仅匹配锚定词之间的内容 |
| \ | 用于转义元字符或特殊字符 |
锚定词:
案例:[ab] : 检索包含a或包含b的行信息,[ ] 中只能表示一个内容
- # 检索包含d或者D的行信息
- [root@server ~]# grep -n [dD] /etc/passwd

案例:[^ ] : 根据关键字检索后反向显示(反向着色)
- # 检索不包含字母o的行信息
- [root@server ~]# grep -n [^o] /etc/passwd
- # 检索不以r开头且包含oot的行信息
- [root@server ~]# grep -n [^r]oot /etc/passwd

- # 检索包含7-9的行信息
- [root@server ~]# grep -n [7-9] /etc/passwd

- # 检索包含数字和字母的行信息
- [root@server ~]# grep -n [0-9a-zA-Z] /etc/sos/sos.conf
- # 检索以"[" 开头的行信息
- [root@server ~]# grep -n "^\[" /etc/sos/sos.conf

注意: 需要过滤元字符时需要加 / 进行转译,去除元字符在正则中的功能,变为普通字符
[root@server ~]# grep -n "^$" /etc/sos/sos.conf
[root@server ~]# grep -n ^[root] /etc/passwd
- [root@server ~]# grep -n r..t /etc/passwd
- #..代表任意两个字符
- [root@server ~]# grep -n ww* /etc/passwd
- #*会对左边的字符重复匹配0次或多次
- #写两个ww为了防止*对左边的字符匹配0次
- [root@timeserver ~]# grep -n "[1-9][0-9][0-9]" /etc/passwd
- #该命令默认使用模糊匹配,仅匹配文件中数字的前三位,因此下图会过滤出65534,
- #需要增加参数 -w 进行精确匹配

当需要匹配更多位数时(7位),上述命令需要重复写7次[0-9],命令过于繁琐,为简化命令
使用范围匹配:{m,n}:将前一项字符重复匹配m-n次。
- [root@timeserver ~]# grep -nw "[0-9]\{3,4\}" /etc/passwd
- #使用范围匹配时花需要将{}转译:花括号左边加\

上述案列中使用参数 -w 进行精确匹配 。
精确匹配的另一种方式:使用锚定词:用于界定边界,仅匹配锚定词之间的内容 。
案例:检索三位数或四位,个位-千位数字取值范围是0-9
[root@timeserver ~]# grep -n "\<[0-9]\{3,4\}\>" /etc/passwd

- [root@timeserver ~]# egrep -n "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
- #+:对前面的字符匹配一次或多次 ^[]:以...开头 [^ ]:不以...开头 扩展正则表达式需用egrep

[root@timeserver ~]# netstat -tan | grep "LISTEN[[:space:]]*$"

| ? | 将前一项字符进行0次或者1次的重复匹配 |
| + | 将前一项进行1次或者多次的重复匹配 |
| (|) | 匹配|符号左边或者右边的字符 |
egrep -n "(root|sshd|chrony)" /etc/passwd

- [root@timeserver ~]# echo /etc/yum.repos.d/ | egrep -o [^/]+/?$
- #参数:-o :只显示红色匹配项

过滤 IP 地址
[root@timeserver ~]# ifconfig ens160 | egrep "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
