1、grep命令的作用和使用场景
grep命令一般用来筛选数据,一般用来筛选我们需要的数据。
格式: grep [参数] [过滤的规则] [路径]
标准输出 | grep [参数] [过滤规则]
2、grep命令的参数
参数:
-n : 显示过滤出来的文件在文件当中的行号
-c : 显示匹配到的行数
-o : 只显示匹配到的内容
-q : 静默输出(一般用来shell脚本当中,然后用 echo $? 查看命令执行结果,0表示成功,非0表示失败))
-i : 忽略大小写
-v :反向查找
-w : 匹配某个词
词:在Linux中,词为一连串字母、数字和下划线组成的字符串
-E :使用扩展正则
-R :递归查询
-l : 只打印文件路径
扩展参数:
-A :显示匹配到的数据的后几n行
-B :显示匹配到的数据的前几n行
-C :显示匹配到的数据的前后各几n行
知识储备: $? 代表上一条命令执行是否成功(0:成功,非0代表失败)
[root@localhost ~]# grep -iq 'Root' /etc/passwd
[root@localhost ~]# echo $?
0
词 :一连串字母和数字和下划线组成的字符串
+ :
wc -l : 打印显示有多少行
3、grep使用案例
1、要求过滤出/etc/passwd中包含的root的行及其行号
[root@localhost ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
2、要求过滤出/etc/passwd中包含的root的行,只显示过滤到的内容
[root@ecs-99217 ~]# grep -o "root" /etc/passwd
root
root
root
root
3、要求过滤/etc/passwd中的Root,忽略大小写
[root@ecs-99217 ~]# grep -i "Root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4、要求匹配mail及其后两行
[root@ecs-99217 ~]# grep -n -A 2 "mail" /etc/passwd
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
5、要求匹配mail及其前两行
[root@ecs-99217 ~]# grep -n -B 2 "mail" /etc/passwd
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6、要求匹配mail及其前后各两行
[root@ecs-99217 ~]# grep -n -C 2 "mail" /etc/passwd
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
7、要求显示包含root的行有多少行
[root@ecs-99217 ~]# grep -c "root" /etc/passwd
2
8、要求查询不包含root的行
[root@ecs-99217 ~]# 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
rngd:x:994:991:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nginx:x:993:988:Nginx web server:/var/lib/nginx:/sbin/nologin
9、匹配yang这个词
[root@localhost ~]# cat 1.txt
12e2341324
dfsdfgsd
oldboy
shanhe
yang:chen
yangchen
[root@localhost ~]# grep -w 'yang' 1.txt
yang:chen
10:要求匹配出包含yang的行
[root@localhost ~]# cat 1.txt
12e2341324
dfsdfgsd
oldboy
shanhe
yang:chen
yangchen
yangyangyang
[root@localhost ~]# grep -E "(yang)+" 1.txt
yang:chen
yangchen
yangyangyang
11、要求找出/etc目录下,哪些文件中包含root
[root@localhost ~]# grep -R "root" /etc/
只打印文件路径
[root@localhost ~]# grep -Rl "root" /etc/
12、计算/etc目录下包含root的文件有多少个?
[root@localhost etc]# grep -R -l "root" /etc/ | wc -l
145
13、查询/etc/passwd文件中包含/bin/bash的行并输出行号
[root@localhost etc]# grep -n "/bin/bash" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
22:test02:x:1001:1001::/home/test02:/bin/bash
23:test03:x:1002:1002::/home/test03:/bin/bash
4、正则表达式
1、普通正则表达式
* :匹配零个或多个前导字符
$ :以前导字符结尾
. :匹配任意一个字符(换行符除外)
^ :以前导字符开头的行
[^] :取反
.* :所有的字符的任何个数
[] : 或者(其中包含的所有的字符的或者)
\ : 转义符
[a-z] :a-z中任意一个字母
[A-Z] :A-Z中任意一个字母
[0-9] :0-9中任意一个数字
2、扩展正则表达式(grep 必须加-E参数,或者使用egrep命令)
egrep 等价于 grep -E
+ : 前导字符的一个或多个
? : 前导字符的零个或一个
| : 或者(竖线两边的字符的或者)
() : 分组,组成一个整体
\n : n代表的是前面第几个分组
{m,n} : 范围,至少有m个,最多有n个
{m} : 范围,固定m个
{m,} : 范围,至少有m个
3、元字符
. : 匹配除换行符以外的任意字符
\w : 匹配字母或数字或下划线或汉字
\s : 匹配任意的空白符
\d : 匹配数字
\b : 匹配单词的开始或结束
^ : 匹配字符串的开始
$ : 匹配字符串的结束
5、正则表达式案例
1、匹配包含22的行
[root@localhost ~]# grep "22?" 1.txt
1111122223333
22223333 .*
2222 2*
222 2?
2、以3结尾的行
[root@localhost ~]# grep -E "3$" 1.txt
1111122223333
3、要求输出包含eth的行
[root@localhost ~]# grep "eth." 2.txt
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfgg-eth0
4、要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
[root@localhost ~]# grep "^[^#]" /etc/nginx/nginx.conf
5、匹配一个或多个2
[root@localhost ~]# egrep "2+" 1.txt
1111122223333
123
1223
1234
234
2
6、查询出包含 22 或者 33 的行
[root@localhost ~]# egrep "22|33" 1.txt
1111122223333
1223
13333