linux三剑客之grep命令

280 阅读2分钟

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