grep 详解

介绍

正则就是一串有规律的字符串;
正则在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和 / 或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。

  • 命令语法
    grep [选项] [参数]

  • 命令描述
    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

  • 命令选项
    -c 表示打印符合要求的行数
    -i 表示忽略大小写;
    -n 表示输出符合要求的行及其行号;
    -v 表示打印不符合要求的行;
    -r 表示遍历所有的子目录;
    -A 后面跟一个数字(有无空格都可以) 例如 -A2 表示打印符合要求的行以及下面两行;
    -B 后面跟一个数字(有无空格都可以) 例如 -A2 表示打印符合要求的行以及上面两行;
    -C 后面跟一个数字(有无空格都可以) 例如 -A2 表示打印符合要求的行以及上下各两行;
    -E‘grep -E’ = egrep

grep 实战(上)

1. 过滤出带有某个关键词的行

[root@localhost grep]# grep -c 'nologin' passwd    //打印符合带有'nologin'的列数
18
[root@localhost grep]# grep 'nologin' passwd
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
nobody❌99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony❌997:995::/var/lib/chrony:/sbin/nologin
user5❌1010:1003::/home/dd1:/sbin/nologin

2. 过滤出带有某个关键词的行并输出行号

[root@localhost grep]# grep -n 'nologin' passwd
2:bin❌1:1:bin:/bin:/sbin/nologin
3:daemon❌2:2:daemon:/sbin:/sbin/nologin
4:adm❌3:4:adm:/var/adm:/sbin/nologin
5:lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail❌8:12:mail:/var/spool/mail:/sbin/nologin
10:operator❌11:0:operator:/root:/sbin/nologin
11:games❌12💯games:/usr/games:/sbin/nologin
12:ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody❌99:99:Nobody:/:/sbin/nologin
14:systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
15:systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
16:dbus❌81:81:System message bus:/:/sbin/nologin
17:polkitd❌998:996:User for polkitd:/:/sbin/nologin
18:tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19:postfix❌89:89::/var/spool/postfix:/sbin/nologin
20:sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21:chrony❌997:995::/var/lib/chrony:/sbin/nologin
26:user5❌1010:1003::/home/dd1:/sbin/nologin

3. 过滤不带有某个关键词的行

[root@localhost grep]# grep -v 'nologin' passwd 
root❌0:0:root:/root:/bin/bash
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
user1❌1000:1000::/home/user1:/bin/bash
user2❌1001:1002::/home/user2:/bin/bash
dd1❌1002:1004::/home/dd1:/bin/bash
user4❌1005:1003::/home/user4:/bin/bash
user11❌1011:1011::/home/user11:/bin/bash

4. 列出所有的子目录

[root@localhost grep]# grep -r 'root' .
./passwd:root❌0:0:root:/root:/bin/bash
./passwd:operator❌11:0:operator:/root:/sbin/nologin
[root@localhost grep]# tree
.
└── passwd

0 directories, 1 file

5. 打印符合要求的行以及下面两行

[root@localhost grep]# grep -A2 'mail' passwd
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin

6. 打印符合要求的行以及上面两行

[root@localhost grep]# grep -B2 'mail' passwd
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin

7. 打印符合要求的行以及上下各两行

[root@localhost grep]# grep -C2 'mail' passwd
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin

grep 实战(中)

8. 过滤出所有包含数字的行

[root@localhost grep]# grep -n '[0-9]' passwd
1:root❌0:0:root:/root:/bin/bash
2:bin❌1:1:bin:/bin:/sbin/nologin
3:daemon❌2:2:daemon:/sbin:/sbin/nologin
4:adm❌3:4:adm:/var/adm:/sbin/nologin
5:lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync❌5:0:sync:/sbin:/bin/sync
7:shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
8:halt❌7:0:halt:/sbin:/sbin/halt
9:mail❌8:12:mail:/var/spool/mail:/sbin/nologin
10:operator❌11:0:operator:/root:/sbin/nologin
11:games❌12💯games:/usr/games:/sbin/nologin
12:ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody❌99:99:Nobody:/:/sbin/nologin
14:systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
15:systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
16:dbus❌81:81:System message bus:/:/sbin/nologin
17:polkitd❌998:996:User for polkitd:/:/sbin/nologin
18:tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19:postfix❌89:89::/var/spool/postfix:/sbin/nologin
20:sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21:chrony❌997:995::/var/lib/chrony:/sbin/nologin
22:user1❌1000:1000::/home/user1:/bin/bash
23:user2❌1001:1002::/home/user2:/bin/bash
24:dd1❌1002:1004::/home/dd1:/bin/bash
25:user4❌1005:1003::/home/user4:/bin/bash
26:user5❌1010:1003::/home/dd1:/sbin/nologin
27:user11❌1011:1011::/home/user11:/bin/bash

9. 过滤出所有不包含数字的行

[root@localhost grep]# grep -v '[0-9]' passwd

10. 过滤出以数字开头的行

[root@localhost grep]# grep -n '^[0-9]' passwd  

###11. 过滤出以 #开头的行

[root@localhost grep]# grep -n '^#' inittab 
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:#
5:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
6:#
7:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
8:#
9:# multi-user.target: analogous to runlevel 3
10:# graphical.target: analogous to runlevel 5
11:#
12:# To view current default target, run:
13:# systemctl get-default
16:# To set a default target, run:
17:# systemctl set-default TARGET.target
18:#

12. 过滤出不以 #开头的行

[root@localhost grep]# grep -nv '^#' inittab 
14:
15:asdfsdfasdf fsd#

说明:在正则表达式中, ^ 表示行的开始, $ 表示行的结尾;

grep 实战 (下)

13. 过滤任意一个字符与重复字符

[root@localhost grep]# grep 'r.o' passwd
root❌0:0:root:/root:/bin/bash
asdfasd:rao:111
f22222:r>o:asdfasdf
operator❌11:0:operator:/root:/sbin/nologin

说明 . 表示任意一个字符,上例中,就是把符合 r 与 o 之间有一个任意字符的行过滤出来


[root@localhost grep]# grep 'ro*o' passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
chrony❌997:995::/var/lib/chrony:/sbin/nologin

说明 * 表示零个或多个前面的字符,空行也包含在内。


14. 指定要过滤字符出现的次数

[root@localhost grep]# grep 'o\{2\}' passwd    //这里的两个\代表脱义。也可以这样写 egrep 'o{2}' passwd
root❌0:0:root:/root:/bin/bash
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin

说明: 这里用到了 {},其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个 o 即 ‘oo’ 的行。注意,{} 左右都需要加上脱意字符 ‘\’
使用 {} 我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’
其中,n1《 n2 表示重复 n1 到 n2 次前面的字符,n2 还可以为空,则表示大于等于 n1 次。


15. 筛选一个或一个以上前面的字符

[root@localhost grep]# grep 'o\+o' passwd       //或者写成 egrep 'o+o' passwd 
root❌0:0:root:/root:/bin/bash
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin

[root@localhost grep]# egrep 'o+t' passwd 
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

16. 筛选字符串 1 字符串 2 或者字符串 2

[root@localhost grep]# egrep 'o?t' passwd     //打印带有两种情况的列 ot 或 t
root❌0:0:root:/root:/bin/bash
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
operator❌11:0:operator:/root:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

[root@localhost grep]# egrep 'o?1o' passwd 
12222:1o:1:bin
222222:r.o1o:asdfasd

17. 筛选字符串 1 或者字符串 2

[root@localhost grep]# grep -E 'root|nologin' passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
nobody❌99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
polkitd❌998:996:User for polkitd:/:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony❌997:995::/var/lib/chrony:/sbin/nologin
user5❌1010:1003::/home/dd1:/sbin/nologin

[root@localhost grep]# grep -Ei 'root|Bus|997' passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
systemd-bus-proxy❌999:997:systemd Bus Proxy:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
chrony❌997:995::/var/lib/chrony:/sbin/nologin

常用字符总结

. 表示任意一个字符
* 表示 0 个或多个前面的字符
{} 表示一个 {} 前面的字符的一个范围
.
表示统配
? 表示 0 个或 1 个?前面的字符
| 表示或者
^ 表示开头