三剑客之 grep

简介: 三剑客之 grep

本文参考文献:

GNU Grep 3.8

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 的功能,妥妥的生产利器

下面给出一些常用的正则表达式

image-20221115110204877.png
还是以 passwd.txt 作为案例

  • *:匹配前面的字符 0 次或者多次

1、匹配 ‘ro’

grep -E 'ro*' passwd.txt

可以匹配 ‘r’ 、'ro' 、'roo'
image-20221115111156914.png
2、匹配 ‘roo’

grep -E 'roo*' passwd.txt

image-20221115111444930.png

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


image-20221115130841524.png
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

image-20221115132006247.png

  • <:锚定单词首部

记得加上 ' \ ' 转义符

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
相关文章
|
Unix Linux Perl
我们一起来学grep
我们一起来学grep
84 0
|
NoSQL Java Linux
netstat -anp | grep 应用 讲解 详细
netstat -anp | grep 应用 讲解 详细
489 0
netstat -anp | grep 应用 讲解 详细
|
Web App开发 应用服务中间件 PHP