正则
什么是正则
egrep是grep的扩展,grep有的功能egrep都有
grep
过滤指定关键词
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数
-a或--text 不要忽略二进制的数据。
-A<显示列数>或--after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
-b或--byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
-B<显示列数>或--before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
-c或--count 计算符合范本样式的列数。
-C<显示列数>或--context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作>或--directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>或--regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
-E或--extended-regexp 将范本样式为延伸的普通表示法来使用。
-f<范本文件>或--file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
-F或--fixed-regexp 将范本样式视为固定字符串的列表。
-G或--basic-regexp 将范本样式视为普通的表示法来使用。
-h或--no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H或--with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。
-i或--ignore-case 忽略字符大小写的差别。
-l或--file-with-matches 列出文件内容符合指定的范本样式的文件名称。
-L或--files-without-match 列出文件内容不符合指定的范本样式的文件名称。
-n或--line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
-q或--quiet或--silent 不显示任何信息。
-r或--recursive 此参数的效果和指定"-d recurse"参数相同。
-s或--no-messages 不显示错误信息。
-v或--revert-match 反转查找。
-V或--version 显示版本信息。
-w或--word-regexp 只显示全字符合的列。
-x或--line-regexp 只显示全列符合的列。
-y 此参数的效果和指定"-i"参数相同。
--help 在线帮助。
用法示例
- 简单过滤 grep ‘过滤词’ 文件名
[root@linux7-128 grep]# grep 'nologin' 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
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sssd:x:991:986:User for sssd:/:/sbin/nologin
gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
在centos7里grep自动带有颜色区分,6是没有颜色的
- 显示行数 -c
[root@linux7-128 grep]# grep -c 'nologin' passwd
38
- 在前面显示行号 -n
[root@linux7-128 grep]# grep -n 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
21:libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
22:radvd:x:75:75:radvd user:/:/sbin/nologin
23:ntp:x:38:38::/etc/ntp:/sbin/nologin
24:saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
25:rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
26:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
27:unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
28:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
29:colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
30:qemu:x:107:107:qemu user:/:/sbin/nologin
31:abrt:x:173:173::/etc/abrt:/sbin/nologin
32:geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
33:setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
35:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
36:pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
37:gdm:x:42:42::/var/lib/gdm:/sbin/nologin
38:sssd:x:991:986:User for sssd:/:/sbin/nologin
39:gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
40:avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
41:tcpdump:x:72:72::/:/sbin/nologin
49:nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
- 不区分大小写 -i
可以把nologin 改为 NOLogin 或者 noLOGIN,然后使用-i检索
[root@linux7-128 grep]# grep -i 'nologin' 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
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sssd:x:991:986:User for sssd:/:/sbin/nologin
gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
- 取反 -v
把不含有nologin的行检索出来,并且显示行号
[root@linux7-128 grep]# grep -vn 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/NOLogin
3:daemon:x:2:2:daemon:/sbin:/sbin/noLOGIN
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
42:huhu:x:1000:1000::/home/huhu:/bin/bash
43:huhu1:x:1001:1001::/home/huhu1:/bin/bash
44:huhu2:x:1005:1006::/home/huhu2:/bin/bash
45:huhu3:x:1007:1005::/home/huhu3:/bin/bash
46:huhu4:x:1008:1005::/home/nhnh:/bin/bash
47:huhu5:x:1010:1009::/home/huhu5:/bin/bash
48:yang:x:1011:1011::/home/yang:/bin/bash
- 遍历所有子目录 -r
可以把/etc/目录下所有含有root的文件都找到
- 过滤出符合要求的行以及下面n行 -An
[root@linux7-128 grep]# grep -nA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/NOLogin
3-daemon:x:2:2:daemon:/sbin:/sbin/noLOGIN
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- 过滤出符合要求的行以及上面n行 -Bn
[root@linux7-128 grep]# grep -nB2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
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
- 过滤出符合要求的行以及上下n行 -Cn
[root@linux7-128 grep]# grep -nC2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/NOLogin
3-daemon:x:2:2:daemon:/sbin:/sbin/noLOGIN
--
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
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
gerp/egrep正则示例
[ ]
- grep ‘[0-9]’ 文件名
检索出文件里含有数字0-9的,加-n显示行号,便于区分
[root@linux7-128 grep]# grep -n '[0-9]' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/NOLogin
3:daemon:x:2:2:daemon:/sbin:/sbin/noLOGIN
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
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
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
21:libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
22:radvd:x:75:75:radvd user:/:/sbin/nologin
23:ntp:x:38:38::/etc/ntp:/sbin/nologin
24:saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
25:rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
26:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
27:unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
28:usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
29:colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
30:qemu:x:107:107:qemu user:/:/sbin/nologin
31:abrt:x:173:173::/etc/abrt:/sbin/nologin
32:geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
33:setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
34:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
35:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
36:pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
37:gdm:x:42:42::/var/lib/gdm:/sbin/nologin
38:sssd:x:991:986:User for sssd:/:/sbin/nologin
39:gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
40:avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
41:tcpdump:x:72:72::/:/sbin/nologin
42:huhu:x:1000:1000::/home/huhu:/bin/bash
43:huhu1:x:1001:1001::/home/huhu1:/bin/bash
44:huhu2:x:1005:1006::/home/huhu2:/bin/bash
45:huhu3:x:1007:1005::/home/huhu3:/bin/bash
46:huhu4:x:1008:1005::/home/nhnh:/bin/bash
47:huhu5:x:1010:1009::/home/huhu5:/bin/bash
48:yang:x:1011:1011::/home/yang:/bin/bash
49:nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
也可以检索出文件里不包含0-9的内容 ,加上-v
[root@linux7-128 grep]# grep -nv '[0-9]' passwd
没有内容,因为passwd文件里每一行都是带有数字的,可以用其他文件试试,比如/etc/inittab
[root@linux7-128 grep]# grep -nv '[0-9]' /etc/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:#
11:#
12:# To view current default target, run:
13:# systemctl get-default
14:#
15:# To set a default target, run:
16:# systemctl set-default TARGET.target
17:#
上面这些内容就是不带有数字的
^
- grep ‘^#’ 文件名
检索出以#号开头的内容
[root@linux7-128 grep]# grep '^#' /etc/sos.conf
#disable = rpm, selinux, dovecot
#rpm.rpmva = off
#general.syslogsize = 15
也可以使用-v检索出不以#号开头的内容
[root@linux7-128 grep]# grep -v '^#' /etc/sos.conf
[plugins]
[tunables]
- grep ‘[^0-9]’ 文件名
检索出不含有数字0-9的内容,符合要求的会变红
加上-v会显示只含有数字0-9的内容
[root@linux7-128 grep]# grep -v '[^0-9]' inittab
22222222222222
132456
- grep ‘^[^0-9]’ 文件名
检索出不以数字开头的内容
[root@linux7-128 grep]# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
sdsfdgfdhgfhgfhfghfhfghgfhgfh
#
fsfsdgdfgdgdf
a1324435
a132424a54544
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view curr
sdfdsf
ent default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
加上-v会显示以数字开头的内容
[root@linux7-128 grep]# grep -v '^[^0-9]' inittab
1324343a322434
22222222222222
132456
总结:
^
放到外面表示以什么什么开头,如果放到[]里,意味着是[]里的字符的反义、非意
.
表示任意的一个字符
- grep ‘字符.字符’ 文件
以左边字符开头,右边字符结尾的内容
[root@linux7-128 grep]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
s2sdsfdf:r1o:sdsfsdfs:23232
xcdscdsfs:rAo:233343:cdfdf
operator:x:11:0:operator:/root:/sbin/nologin
*
表示*号左边的字符重复0-n次
- grep ‘字符*字符’ 文件
[root@linux7-128 grep]# grep 'h*w' passwd
hhhhhhhhhhw:
wdwwwww
zxxsdww
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
- grep ‘.*’ 文件
把所有文件内容检索出来
- grep ‘hu.*bash’ passwd
[root@linux7-128 grep]# grep 'hu.*bash' passwd
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
{} 表示前面字符的重复范围
- grep ‘o{2}’ passwd
检索出o出现2次的内容
[root@linux7-128 grep]# grep 'o\{2\}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
huhu4:x:1008:1005::/hooome/nhnh:/bin/bash
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
grep ‘o{1,3}’ passwd
检索出o出现1-3次的内容egrep ‘o{2}’ passwd= grep -E ‘o{2}’ passwd=grep ‘o{2}’ passwd
*检索出o出现2次的内容,使用egrep可以不使用脱义符*
[root@linux7-128 grep]# egrep 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
huhu4:x:1008:1005::/hooome/nhnh:/bin/bash
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
- egrep ‘(oo){2}’ passwd
检索出oo出现2次的内容
[root@linux7-128 grep]# egrep '(oo){2}' passwd
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
+
表示前面字符的1次或n次
跟*
相比是他从1次开始,*
是从0次开始
- grep ‘o+o’ passwd =egrep ‘o+o’ passwd
[root@linux7-128 grep]# grep 'o\+o' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
huhu4:x:1008:1005::/hooome/nhnh:/bin/bash
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
‘?’表示?前面的字符重复次数为0或1次
[root@linux7-128 grep]# egrep 's?dw' passwd
wdwwwww
zxxsdww
|
表示或者,可以写多个
[root@linux7-128 grep]# egrep 'root|huhu' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/hooome/nhnh:/bin/bash
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
()
表示一个组合
- egrep ‘(oo){2}’ passwd
检索出oo出现2次的内容
[root@linux7-128 grep]# egrep '(oo){2}' passwd
huhu5:x:1010:1009::/hoooome/huhu5:/bin/bash
sed
sed和grep相比,sed也能实现grep的功能,但是有点麻烦,而且没有用颜色显示,强项在于替换。
匹配指定字符串
sed -n ‘/字符串/’p 文件
[root@linux7-128 sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
使用
*
、?
、.
、+
、{}
、|
、^
、……
[root@linux7-128 sed]# sed -n '/r*t/'p passwd
[root@linux7-128 sed]# sed -n '/r.t/'p passwd
[root@linux7-128 sed]# sed -n '/^t/'p passwd
+、?号需要使用脱义符
[root@linux7-128 sed]# sed -n '/r\+t/'p passwd
[root@linux7-128 sed]# sed -n '/r\?t/'p passwd
或者使用sed -nr
[root@linux7-128 sed]# sed -nr '/r+t/'p passwd
[root@linux7-128 sed]# sed -nr '/r?t/'p passwd
[root@linux7-128 sed]# sed -nr '/o{2}/'p passwd
[root@linux7-128 sed]# sed -nr '/root|huhu/'p passwd
打印指定行
打印第二行
[root@linux7-128 sed]# sed -n '2'p passwd
bin:x:1:1:bin:/bin:/sbin/nologin
打印第二到第五行
[root@linux7-128 sed]# sed -n '2,5'p 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
打印第45到最后一行
[root@linux7-128 sed]# sed -n '45,$'p passwd
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
sed -e
多重命令相结合
先匹配出第一行,在匹配出含有root字符串的行
[root@linux7-128 sed]# sed -e '1'p -e '/root/'p -n passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
不区分大小写匹配 I
[root@linux7-128 sed]# sed -n '/root/'Ip passwd
root:x:0:0:root:/root:/bin/bash
sdffgfBusvfgRoot
operator:x:11:0:operator:/root:/sbin/nologin
删除匹配行 sed -i
只是在屏幕上删除,显示剩余的行内容
[root@linux7-128 sed]# sed '1,45'd passwd
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
在文件里根据行数删除
[root@linux7-128 sed]# wc -l passwd
50 passwd
[root@linux7-128 sed]# sed -i '1,45'd passwd
[root@linux7-128 sed]# wc -l passwd
5 passwd
根据指定字符串删除
[root@linux7-128 sed]# sed -i '/yang/'d passwd
替换
- sed ‘1,10s/root/toor/g’ passwd
1-10行的root替换为toor
会把所有的内容打印出来
- sed -r ‘1,10s/ro+/r/g’ passwd |head
把1-10行的ro+替换为r,即之前的root现在变为了rt
[root@linux7-128 sed]# sed -r '1,10s/ro+/r/g' passwd |head
rt:x:0:0:rt:/rt:/bin/bash
sdffgfBusvfgRoot
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
- sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
把第一段和最后一段调换位置
[root@linux7-128 sed]# head passwd |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/bin/bash:x:0:0:root:/root:root
sdffgfBusvfgRoot
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
[^:]+ : 非冒号,一个或多个 1
:(.*): :贪婪匹配,一直匹配到最后一个冒号 2
[^:]+ :非冒号,一个或多个 3
前面用小括号()括起来的,后面用反斜杠\数字去表示
- 替换内容时,有/,需要用\
[root@linux7-128 sed]# head passwd |sed 's/\/sbin\/nologin/123/g'
root:x:0:0:root:/root:/bin/bash
sdffgfBusvfgRoot
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
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:123
或者使用@、#等替换分隔符
[root@linux7-128 sed]# head passwd |sed 's@/sbin/nologin@123@g'
root:x:0:0:root:/root:/bin/bash
sdffgfBusvfgRoot
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
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:123
- 把英文字母全部删除,相当于替换为空
sed 's/[a-zA-Z]//g
[root@linux7-128 sed]# head passwd |sed 's/[a-zA-Z]//g'
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
- 把所有行前面加一个字符串
sed -r 's/(.*)/aaa:&/'
&表示前面的小括号()
[root@linux7-128 sed]# head passwd |sed -r 's/(.*)/aaa:&/'
aaa:root:x:0:0:root:/root:/bin/bash
aaa:sdffgfBusvfgRoot
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
awk
awk跟sed相比,它支持了分段。例如/etc/passwd文件,它里面的文件内容就用:分了7段。
awk语法结构:
awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}' filename
示例
- 将passwd文件打印第一段
[root@linux7-128 awk]# awk -F ':' '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
.........
- 将passwd文件打印所有段
$0
表示所有,也可以将-F ‘:’去掉
awk -F ':' '{print $0}' passwd ==awk '{print $0}' passwd ==cat passwd
[root@linux7-128 awk]# awk -F ':' '{print $0}' passwd
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
...........
**注意:
如果awk忽略了-F,默认将会以空格、空白字符为分隔符去打印**
- 打印多段
awk -F ‘:’ ‘{print 3,$5}’ passwd
[root@linux7-128 awk]# awk -F ':' '{print $1,$3,$5}' passwd
root 0 root
bin 1 bin
daemon 2 daemon
adm 3 adm
lp 4 lp
sync 5 sync
shutdown 6 shutdown
halt 7 halt
mail 8 mail
.........
- 指定字符分割,不用空格,例如使用#
[root@linux7-128 awk]# awk -F ':' '{print $1"#"$3"#"$5}' passwd
root#0#root
bin#1#bin
daemon#2#daemon
adm#3#adm
lp#4#lp
sync#5#sync
shutdown#6#shutdown
halt#7#halt
mail#8#mail
operator#11#operator
games#12#games
...........
- 匹配含有oo的行
[root@linux7-128 awk]# awk '/oo/' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
- 匹配含有oo的第一段
[root@linux7-128 awk]# awk -F ':' '$1 ~ /oo/' passwd
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
- 支持正则
[root@linux7-128 awk]# awk -F ':' '$1 ~ /oo+/' passwd
- 多个表达式一起写
awk -F ‘:’ ‘/root/ {print
3} /huhu/ {print
3}’ passwd ==
awk -F ‘:’ ‘/root|huhu/ {print
3}’ passwd
[root@linux7-128 awk]# awk -F ':' '/root/ {print $1,$3} /huhu/ {print $1,$3}' passwd
root 0
operator 11
huhu 1000
huhu1 1001
huhu2 1005
huhu3 1007
huhu4 1008
huhu5 1010
- 数学符号
>
、<
、==
、、、
第三段等于0的
[root@linux7-128 awk]# awk -F ':' '$3==0 {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
第三段大于1000的
[root@linux7-128 awk]# awk -F ':' '$3>=1000 {print $0}' passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
双引号的含义
[root@linux7-128 awk]# awk -F ':' '$3>="1000" {print $0}' passwd
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
............
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
加上双引号”“之后,相当于sort不加-n。就代表1000不再是数字,而是一个字符串,是以ASSIC码计算的。
第七段的值不等于/sbin/nologin
[root@linux7-128 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
- 字段之间相互比较
字段3小于字段4的
[root@linux7-128 awk]# awk -F ':' '$3<$4 {print $0}' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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
huhu2:x:1005:1006::/home/huhu2:/bin/bash
字段3大于5并且小于7 &&,加上双引号之后是用ASSIC码比较的
[root@linux7-128 awk]# awk -F ':' '$3>"5" && $3<"7" {print $0}' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
字段3大于950或者字段7等于/bin/bash ||
[root@linux7-128 awk]# awk -F ':' '$3>950 || $7=="/bin/bash" {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
libstoragemgmt:x:997:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
colord:x:994:991:User for colord:/var/lib/colord:/sbin/nologin
geoclue:x:993:990:User for geoclue:/var/lib/geoclue:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
sssd:x:991:986:User for sssd:/:/sbin/nologin
gnome-initial-setup:x:990:985::/run/gnome-initial-setup/:/sbin/nologin
huhu:x:1000:1000::/home/huhu:/bin/bash
huhu1:x:1001:1001::/home/huhu1:/bin/bash
huhu2:x:1005:1006::/home/huhu2:/bin/bash
huhu3:x:1007:1005::/home/huhu3:/bin/bash
huhu4:x:1008:1005::/home/nhnh:/bin/bash
huhu5:x:1010:1009::/home/huhu5:/bin/bash
yang:x:1011:1011::/home/yang:/bin/bash
nginx:x:989:984:Nginx web server:/var/lib/nginx:/sbin/nologin
OFS
指定打印后的分隔符
[root@linux7-128 awk]# awk -F ':' '{OFS="#"} $3>1000|| $7=="/bin/bash" {print $1,$3,$7}' passwd
root#0#/bin/bash
nfsnobody#65534#/sbin/nologin
huhu#1000#/bin/bash
huhu1#1001#/bin/bash
huhu2#1005#/bin/bash
huhu3#1007#/bin/bash
huhu4#1008#/bin/bash
huhu5#1010#/bin/bash
yang#1011#/bin/bash
使用if嵌套规范写法:
awk -F ':' '{OFS="#"} {if($3>1000|| $7=="/bin/bash") {print $1,$3,$7}}' passwd
NR 表示行
awk -F ':' '{print NR":"$0}' passwd == grep -n ':' passwd
[root@linux7-128 awk]# awk -F ':' '{print NR":"$0}' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
.........
- 打印前10行
[root@linux7-128 awk]# awk -F ':' 'NR<=10' passwd
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
- 打印前十行并且第一段包含root或者sync的
[root@linux7-128 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
NF 表示段
[root@linux7-128 awk]# awk -F ':' '{print NF":"$0}' passwd
6:rootx:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
........
- 打印段数为6并且第一段包含root或者sync的的
[root@linux7-128 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' passwd
rootx:0:0:root:/root:/bin/bash
=
赋值,将前三行第一段赋值为root
[root@linux7-128 awk]# head -n 3 passwd |awk -F ':' '$1="root"'
root 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
定义分割符为:
[root@linux7-128 awk]# head -n 3 passwd |awk -F ':' '{OFS=":"} $1="root"'
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
- 求第三段所有值之和
[root@linux7-128 awk]# awk -F ':' '{tot=tot+$3}; END {print tot}' passwd
85271
[root@linux7-128 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwd
85271
括号可以不加
拓展
- 把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
- 练习题