grep命令
1 命令选项
grep [op]... parttern [file]...
选项:
-c 只显示符合条件的'行数'
-d|-r:递归查找目录下所有文件。。。
-E 使用'扩展正则' 相当于命令'egrep'
-e 多个匹配条件'逻辑或'
-f 匹配条件非常多时,写在文件中,然后使用'-f file',表示同时启用所有条件【关系为逻辑或】
-i 忽略大小写
-n 在匹配结果前显示每一行的'行号
-o 只显示'keyword'【默认显示'包含keyword的行'】
-q 执行命令但'不输出结果',常用于脚本条件判断
-v 取反,排除匹配结果,只显示'不符合条件的行
-w key :精确匹配单词key,'相当于词首词尾锚定'
ABC匹配结果附带前后行一起输出
-A 表示附带后面N行
-B 表示附带前面N行
-C = '-A' + '-B'
范例:
# 选项加上-n是为了证实确实是匹配结果的后面3行
[15:12:09root@CentOS8/~]# grep root -nA3 /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
=
2 排除过滤
grep默认只显示【符合条件的行】,- v 选项只显示【不符合条件的行】
[11:52:17root@CentOS8/~]# grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.......
=
**忽略大小写- i **
grep默认大小写敏感,- i 选项忽略大小写
[14:02:53root@CentOS8/~]# grep ROOT /etc/passwd #不加选项无输出结果
[14:07:15root@CentOS8/~]# grep -i ROOT /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
=
**显示行号 -n **:
- 文本过多时,显示行号方便查看
- 显示匹配结果在原文中的行号
[14:07:23root@CentOS8/~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
**显示行数量 - c **, 只显示有多少行符合条件
[14:48:55root@CentOS8/~]# grep -c root /etc/passwd
2
=
3 keywords
- o 只显示keywords:- o 只显示所有匹配的内容,可知keywords数量
[15:05:16root@CentOS8/~]# grep -o root /etc/passwd
root
root
root
root
=
静默模式:- q 选项执行命令但不输出结果,常用于脚本条件判断
# 执行后查看 $? 变量可知是否匹配。 $?=0表示有匹配结果
范例
[15:07:09root@CentOS8/~]# grep aaaaa -q /etc/passwd
[15:11:52root@CentOS8/~]# echo $?
1 # 表示无法匹配到'aaaaa'
[15:12:00root@CentOS8/~]# grep root -q /etc/passwd
[15:12:07root@CentOS8/~]# echo $?
0
=
4 逻辑或
选项 - e 多个条件满足其一(几个条件就有几次 - e )
注意区别: - E 表示使用正则表达式
逻辑或范例
[15:17:15root@CentOS8/~]# grep -e root -e jack /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
jacklee:x:1000:1000:jacklee:/home/jacklee:/bin/bash
[15:19:46root@CentOS8/~]# grep -e root -e aaaa /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
若过滤规则过多,将其写在文件中使用选项 - f 进行匹配(逻辑 = 或)
因为太多 - e 写起来太麻烦
[15:34:59root@CentOS8/data]# cat a.txt
root
body
system
[15:35:01root@CentOS8/data]# grep -f a.txt /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
选项 - f 功能的拓展:用于取两文件的相同行(特定的文件内容,实际上还是上一条的功能)
[root@centos8/~]# grep -f jackA jackA.orig
2020-01
2020-02
2020-04
2020-05
2020-07
2020-08
=
5 逻辑与
**使用管道而不是 - e **
[15:26:01root@CentOS8/~]# grep root /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
[15:26:15root@CentOS8/~]# grep root /etc/passwd | grep aaaaa # 无结果
[15:26:25root@CentOS8/~]#
=
6 单词锚定
选项 - w 精确匹配单个单词
单词判断依据——字母数字下划线连续组合都视为单词
单词判断依据——字母数字下划线连续组合都视为单词
单词判断依据——字母数字下划线连续组合都视为单词
注意:仍然是匹配整行,区别keyword
[15:26:25root@CentOS8/~]# grep jack /etc/passwd
jacklee:x:1000:1000:jacklee:/home/jacklee:/bin/bash # 包含jack有结果
[15:29:21root@CentOS8/~]# grep -w jack /etc/passwd # 指定jack无结果
[15:29:38root@CentOS8/~]# grep -w jacklee /etc/passwd
jacklee:x:1000:1000:jacklee:/home/jacklee:/bin/bash
=