本文参考文献:
grep 是一个在 UNIX 上的命令行工具,它通过给定的模式(pattern)来搜索一个输入文件,并输出匹配到这些模式的内容
grep 于1974年公开,是文本三剑客中最早出生的(另外两个是 sed、awk),由 Ken Thompson 创造(UNIX 之父)
grep 基本就是玩正则匹配,一般会玩 grep 的人,正则表达式都比较强
今天这篇文章主要目的还是为了引起大家对 grep 的兴趣,对于这个上古神器还需要大家自行去查阅相关文档去进一步学习
废话少说,开始今天的 grep 学习之旅吧!
grep 基本格式
grep <选项> <pattern> 文件或目录
grep 选项:
-E:支持扩展正则表达式
-i:忽略大小写
-n:将行号打印出来
-o:只输出匹配内容
-c:只输出匹配内容的行数
-B:输出匹配内容的前n行
-A:输出匹配内容的后n行
-C:输出匹配内容的前后n行
-v:输出不匹配的行(取反操作)
-e:多个操作,例如:grep -e ’A‘ -e 'B'
1.基本参数
下面的文本内容作为演示案例
passwd.txt
root:x:0:0:root:/root:/bin/bash
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
#minion2:x:1000:1000::/home/admin:/bin/bash
#nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
- -E 支持扩展正则表达式
可以看到这个文本里面有空行,也有 # 开头的注释
1、将过滤掉空行的内容输出出来
grep -E -v '^$' passwd.txt
其中,-E 是指支持扩展正则表达式;-v 是指将非空行的内容打印出来;'^$' 则表示空行
root:x:0:0:root:/root:/bin/bash
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
#minion2:x:1000:1000::/home/admin:/bin/bash
#nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
2、将过滤掉注释的内容输出出来
grep -E -v '^#' passwd.txt
其中 '^#' 指以 # 开头,也就是注释
root:x:0:0:root:/root:/bin/bash
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
- -i:忽略大小写
1、将 sys 过滤出来(不忽略大小写)
grep 'sys' passwd.txt
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
2、将 sys 过滤出来(忽略大小写)
grep -i 'sys' passwd.txt
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
- -n:将行号打印出来
grep -n 'sys' passwd.txt
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
- -o:只输出匹配内容
1、匹配 root (不加 -o)
grep 'root' passwd.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2、匹配 root (加 -o)
grep -o 'root' passwd.txt
root
root
root
root
- -c:只输出匹配内容的行数
grep -c 'root' passwd.txt
2
- -B:输出匹配内容的前n行
1、匹配 'daemon',并输出其前两行
grep -B 2 'daemon' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
- -A:输出匹配内容的后n行
1、匹配 'root',并输出其后两行
grep -A 2 'root' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- -C:输出匹配内容的前后n行
grep -C 2 'root' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- -v:输出不匹配的行(取反操作)
1、过滤掉 'root'
grep -v 'root' passwd.txt
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:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
#minion2:x:1000:1000::/home/admin:/bin/bash
#nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
- -e:多个操作
1、将匹配到 ‘root’ 和 'daemon' 打印出来
grep -e 'root' -e 'daemon' passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
或者可以使用扩展正则式
grep -E 'root|daemon' passwd.txt
2.正则表达式
通过使用正则表达式可以进一步扩展 grep 的功能,妥妥的生产利器
下面给出一些常用的正则表达式
还是以 passwd.txt 作为案例
- *:匹配前面的字符 0 次或者多次
1、匹配 ‘ro’
grep -E 'ro*' passwd.txt
可以匹配 ‘r’ 、'ro' 、'roo'
2、匹配 ‘roo’
grep -E 'roo*' passwd.txt
3、如果我们要匹配 root ,但是你不知道具体单词,只知道前后,你可以这样
grep -E 'r*t' passwd.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
- ^:匹配以某个字符开头的行
1、匹配以 sy 开头的行
grep -E '^sy' passwd.txt
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
2、匹配注释(以 # 开头)
grep -E '^#' passwd.txt
#minion2:x:1000:1000::/home/admin:/bin/bash
#nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
- $:匹配以什么字符结尾的行
1、匹配以 t 结尾的行(是看行尾,不是字符串尾)
grep -E 't$' passwd.txt
halt:x:7:0:halt:/sbin:/sbin/halt
2、匹配以空白开头,空白结尾的行(其实就是空行)
grep -E '^$' passwd.txt
- .*:匹配任意长度的任意字符
1、匹配包含 'no' 的任意字符
grep -E 'no.*' passwd.txt
2、过滤出当前目录下 包含 '.txt' 的文件
ll | grep -E '*.txt'
-rw-r--r-- 1 root root 1198 11月 15 11:07 passwd.txt
-rw-r--r-- 1 root root 1598 11月 15 10:12 test.txt
- [ ]:匹配括号内的字符
1、匹配 'oot' 、'rot'
grep -E '[ro]ot' passwd.txt
2、匹配 'rt' 、'ot'
grep -E '[roo]t' passwd.txt
- [^]:不匹配括号内的字符(取反操作)
1、匹配到 'rt' 、'ot',然后取反(就是取反输出)
grep -E '[^roo]t' passwd.txt
- <:锚定单词首部
记得加上 ' \ ' 转义符
1、匹配出 ‘ro’(以 ro 开头的单词)
grep -E '\<ro' passwd.txt
PS:加上尾部锚定符的话是匹配不出来的,因为文本里没有 ro 这个单词
grep -E '\<ro\>' passwd.txt
>
:锚定 单词尾部
1、匹配 'ot' 结尾的单词
grep -E 'ot\>' passwd.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
PS:加上首部锚定符的话是匹配不出来的,因为没有 ot 这个单词
grep -E '\<ot\>' passwd.txt
- {m,n}:表示匹配前面的字符出现至少m次,至多n次
1、匹配 'o' 'oo'
grep -E 'o{1,2}' passwd.txt
PS:例子中的正则表示 o 最少是一个,最多是两个(oo)
2、匹配 'aa','aaa'或'aaaa'
grep -E 'a{2,4}' passwd.txt