2018-08-18笔记

正则

什么是正则

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 1 , 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 1 , 3} /huhu/ {print 1 , 3}’ passwd ==
awk -F ‘:’ ‘/root|huhu/ {print 1 , 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/

  • 练习题

http://www.apelearn.com/study_v2/chapter14.html

猜你喜欢

转载自blog.csdn.net/u013946328/article/details/80592029