1.正则介绍_grep上
正则:遗传有规律的字符串,对于编写壳脚本有很大的帮助;各种编程语言中都有正则,原理是一样的
grep:过滤指定关键次,关键词用单引号引起来,它仅仅是实现正则的工具。用法:grep [-cinvABC]'word'文件名
-c 行数
[root @ Chauncey~] #grep -c 'root' passwd
2
-i 不区分大小写
[root @ Chauncey~]#grep -i'user'passwd
ftp:x:14:50:FTP用户:/ var / ftp:/ sbin / nologin
saslauth:x:499:76:SaslaUthd用户:/ var / empty / saslauth:/ sbin / nologin
User1:x:500:500 :: / home / User1:/ bin / bash
-n 显示行号
[root @ Chauncey~]#grep -in'user'passwd
14:ftp:x:14:50:FTP用户:/ var / ftp:/ sbin / nologin
17:saslauth:x:499:76:SaslaUthd用户:/ var / empty / saslauth:/ sbin / nologin
23:User1:x:500:500 :: / home / User1:/ bin / bash
-v 取反,可以理解为没有关键次的行
[root @ Chauncey~] #grep -inv'1'1.txt
8:53
9:3
10:33333
-r 将子目录或者孙目录下的文件遍历一遍
[root @ Chauncey~]#grep -r'root '/ etc /
/ etc / group-:root:x:0:
/etc/postfix/master.cf :# service type private unpriv chroot wakeup maxproc command + args
/ etc / passwd-:operator:x:11:0:operator:/ root:/ sbin / nologin
/etc/selinux/restorecond.conf:/root/.ssh/*二进制文件/ etc / selinux / targeted / policy / policy。 24场比赛
/etc/selinux/targeted/contexts/files/file_contexts.homedirs:/homesystem_u:object_r:home_root_t:s0
不加-r的情况:
[root @ Chauncey~] #grep'root'/ etc /
grep:/ etc /:是一个目录
-A后面跟数字,过滤出符和要求的行以及下面n行
[root @ Chauncey~] #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:守护进程:/ sbin:/ sbin / nologin
-
11:运算符:x:11:0:运算符:/ root:/ sbin / nologin
12 -games:x:12: 100:游戏:/ usr / games:/ sbin / nologin
13 -gopher:x:13:30:gopher:/ var / gopher:/ sbin / nologin
-B同上,过滤出符和要求的行以及上面n行
[root @ Chauncey~] #grep -niB3'user'passwd
11 -operator :x:11:0:operator:/ root:/ sbin / nologin
12 -games:x:12:100:games:/ usr / games: / sbin / nologin
13 -gopher:x:13:30:gopher:/ var / gopher:/ sbin / nologin
14:ftp:x:14:50:FTP 用户:/ var / ftp:/ sbin / nologin
15-nobody :x:99:99:没有人:/:/ sbin / nologin
16-vcsa:x:69:69:虚拟控制台内存所有者:/ dev:/ sbin / nologin
17:saslauth:x:499:76:SaslaUthd 用户:/ var / empty / saslauth:/ sbin / nologin
-
20 -ntp:x:38:38 :: / etc / ntp:/ sbin / nologin
21 -tcpdump:x:72:72 :: /:/ sbin / nologin
22 -nscd:x:28:28:NSCD守护进程:/:/ sbin / nologin
23:User1:x:500:500 :: / home / 用户 1:/ bin / bash
-C同上,同时过滤出符和要求的行以及上下个n行
[root @ Chauncey~] #grep -niC2'user'passwd
12 -games :x:12:100:games:/ usr / games:/ sbin / nologin
13 -gopher:x:13:30:gopher:/ var / gopher:/ sbin / nologin
14:ftp:x:14:50:FTP 用户:/ var / ftp:/ sbin / nologin
15 -nobody:x:99:99:没人:/:/ sbin / nologin
16 -vcsa: x:69:69:虚拟控制台内存所有者:/ dev:/ sbin / nologin
17:saslauth:x:499:76:SaslaUthd 用户:/ var / empty / saslauth:/ sbin / nologin
18 -postfix:x:89: 89 :: / var / spool / postfix:/ sbin / nologin
19-sshd:x:74:74:特权分离的SSH:/ var / empty / sshd:/ sbin / nologin
-
21 -tcpdump:x:72:72 :: /:/ sbin / nologin
22 -nscd:x: 28:28:NSCD守护进程:/:/ sbin / nologin
23:User1:x:500:500 :: / home / 用户 1:/ bin / bash
24 -yeyunyi:x:501:0 :: / home / yeyunyi: /斌/庆典
2.grep中
grep '[0-9]' filename #0-9中只要匹配上一个数字,就可以过滤出来
[root@Chauncey ~]# grep '[0-9]' grep-test
#12345
#123
$123
1234
23456
234oooo2344
1o1
2oo2
3ooo3
grep -nv'^#'filename #过虑非#号开头的行查看shell时可用
[root@Chauncey ~]# grep -nv '^#' grep-test
4:$wdss
5:$dvfaf
6:$123
7:1234
8:23456
9:234oooo2344
10:1o1
11:2oo2
12:3ooo3
grep -v'^#'filename | grep -v'^ $' #过虑非#号开头和非$开头的行
[root@Chauncey ~]# grep -v '^#' inittab | grep -v '^1'
$hkuhuu
$fhtfh
id:3:initdefault:
[root@Chauncey ~]#
grep'[^ 0-9]'filename #只要有一个非数字字符的行
[root@Chauncey ~]# cat -n grep-test
1 #12345
2 #123
3 #wsde
4 $wdss
5 $dvfaf
6 $123
7 1234
8 23456
9 234oooo2344
10 1o1
11 2oo2
12 3ooo3
13 333333o3
14 333303
15 333o789
16 qawd
17 wsed
18 erf
19 1.1
[root@Chauncey ~]# grep -n '[^0-9]' grep-test
1:#12345
2:#123
3:#wsde
4:$wdss
5:$dvfaf
6:$123
9:234oooo2344
10:1o1
11:2oo2
12:3ooo3
13:333333o3
15:333o789
16:qawd
17:wsed
18:erf
19:1.1
[root@Chauncey ~]#
grep'^ [0-9]'filename #过滤以数字开头的行
[root@Chauncey ~]# grep '^[^0-9]' grep-test
#12345
#123
#wsde
$wdss
$dvfaf
$123
qawd
wsed
erf
grep'^ [^ 0-9]'filename #过滤非数字开头的行中括号内的^是非的意思,中括号外的是锚定行首
[root@Chauncey ~]# grep '^[^0-9]' grep-test
#12345
#123
#wsde
$wdss
$dvfaf
$123
qawd
wsed
erf
3.grep下
grep'r.o”文件名 .表示匹配任意的一个字符,包括.本身
grep '1.' grep-test
#12345
#123
$123
1234
1o1
1.1
grep的'O * O'文件名 *表示左边的字符重复Ñ次,结尾必须是右边的字符
[root@Chauncey ~]# grep '3*o3' grep-test
3ooo3
333333o3
[root@Chauncey ~]# grep '3o*3' grep-test
3ooo3
333333o3
333303
grep' .* 'filename .*表示任意一个或多个任意字符,左右的都匹配
[root@Chauncey ~]# grep '.*' grep-test
#12345
#123
#wsde
$wdss
$dvfaf
$123
1234
23456
234oooo2344
1o1
2oo2
3ooo3
333333o3
333303
qawd
wsed
erf
1.1
grep'o \ {2 \}' filename o出现两次,正则中{}表示前边字符的出现范围,例如:grep -E'(oo){2}'filename oo出现两次,四个o
[root@Chauncey ~]# grep '3\{3\}' grep-test
333333o3
333303
[root@Chauncey ~]# grep '3\{5\}' grep-test
333333o3
[root@Chauncey ~]#
grep'o \ {0,3 \} 'filename o出现1-3次,表示范围
egrep:扩展的grep,相当于grep -E,可去掉转义符:egrep'o {2}'file
[root@Chauncey ~]# egrep '3{5}' grep-test
333333o3
[root@Chauncey ~]#
egrep 'o+o' filename +前边的字符出现1次及以上,不允许0次
[root@Chauncey ~]# egrep 'z+3' grep-test
[root@Chauncey ~]# cat grep-test
#12345
#123
#wsde
$wdss
$dvfaf
$123
1234
23456
234oooo2344
1o1
2oo2
3ooo3
333333o3
333303
qawd
wsed
erf
1.1
egrep 'o?o ' filename ?前边的字符重复次数0次或者1次
[root@Chauncey ~]# egrep '3?o3' grep-test
3ooo3
333333o3
egrep 'root | nologin' filename |表示或者的意思
[root@Chauncey ~]# egrep '123|z' grep-test
#12345
#123
$123
1234
[root@Chauncey ~]# egrep '123|a' grep-test
#12345
#123
$dvfaf
$123
1234
qawd
[root@Chauncey ~]#
4.sed上
SED:可以进行匹配和替换操作
sed的匹配用法:sed -n'/ word /'p filename,-n是只输出处理的行,p为print打印,-r,
[root@Chauncey ~]# sed -n '/123/'p grep-test
#12345
#123
$123
1234
sed -nr'/ word /'p filename,-r可以省略关键字中的脱义符号,相当于grep的-E
[root@Chauncey ~]# sed -n '/o\{1,3\}/p' grep-test
234oooo2344
1o1
2oo2
3ooo3
333333o3
333o789
[root@Chauncey ~]# sed -nr '/o{1,3}/p' grep-test
234oooo2344
1o1
2oo2
3ooo3
333333o3
333o789
sed -n'n'p filename #打印文件的第几行
sed -n'n,n + x'p文件名
[root@Chauncey ~]# sed -n '2'p grep-test
#123
[root@Chauncey ~]# cat -n grep-test
1 #12345
2 #123
3 #wsde
4 $wdss
5 $dvfaf
6 $123
7 1234
8 23456
9 234oooo2344
打印文件的第Ñ到N + X行,表示范围
sed -n'n,$'p filename打印文件的第n到最后一行
[root@Chauncey ~]# sed -n '11,$'p grep-test
2oo2
3ooo3
333333o3
333303
333o789
qawd
wsed
erf
1.1
sed -e'n'p -e'/ word /'p -n filename -e选项允许在同一行里执行多条命令,前一段为打印第n行,后一段为打印匹配到关键字的行,命令之间是单独执行的关系,因此即使输出结果是一样的,也会分次输出,-e可以多次使用
[root@Chauncey ~]# sed -e '2'p -e '/123/'p -n grep-test
#12345
#123
#123
$123
1234
[root@Chauncey ~]# sed -e '2'p -e '/3/'p -n grep-test
#12345
#123
#123
$123
1234
23456
234oooo2344
3ooo3
333333o3
333303
333o789
5.sed下
sed -n ‘/a/’Ip filename I在这里可以忽略大小写
[root@Chauncey ~]# sed -n '/a/'Ip grep-test
$dVBaf
qawd
ABC
sed ‘n,m’d filename sed的删除功能,删除从n到m行(指定范围,也可不指定,不写即可),也可以直接删除匹配到关键字的行,此种删除并不会改变源文件
[root@Chauncey ~]# cat yum.log
Mar 30 17:49:12 Installed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Installed: nano-2.0.9-7.el6.x86_64
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]# sed '1,2'd yum.log
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]# wc -l yum.log
6 yum.log
[root@Chauncey ~]# sed '/Updated/'d yum.log
Mar 30 17:49:12 Installed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Installed: nano-2.0.9-7.el6.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]#
sed -i '/word/'d filename , -i选项,能够直接对源文件进行操作
[root@Chauncey ~]# sed -i '/Updated/'d yum.log
[root@Chauncey ~]# cat yum.log
Mar 30 17:49:12 Installed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Installed: nano-2.0.9-7.el6.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]# wc -l yum.log
3 yum.log
[root@Chauncey ~]#
sed的查找替换功能 :
sed ‘n,m s/word/word/g' filename #n,m为指定的范围,s为替换命令,第一个word是被替换的关键字,第二个word是替换的关键字,g指全局替换
[root@Chauncey ~]# cat yum.log
Mar 30 17:49:12 Installed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Installed: nano-2.0.9-7.el6.x86_64
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]# sed '1,2 s/Installed/Updated/g' yum.log
Mar 30 17:49:12 Updated: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Updated: nano-2.0.9-7.el6.x86_64
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
sed -r ‘n,ms/RE/word/g' filename -r选项是支持扩展正则表达式,被替换的内容使用正则表达式时使用-r
[root@Chauncey ~]# sed '1,2s/al+/z/g' yum.log
Mar 30 17:49:12 Installed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Installed: nano-2.0.9-7.el6.x86_64
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]# sed -r '1,2s/al+/z/g' yum.log
Mar 30 17:49:12 Instzed: lrzsz-0.12.20-27.1.el6.x86_64
Apr 25 18:32:37 Instzed: nano-2.0.9-7.el6.x86_64
May 07 19:55:14 Updated: openssh-5.3p1-123.el6_9.x86_64
May 07 19:55:14 Updated: openssh-clients-5.3p1-123.el6_9.x86_64
May 07 19:55:15 Updated: openssh-server-5.3p1-123.el6_9.x86_64
Dec 17 12:32:07 Installed: 1:bash-completion-1.3-7.el6.noarch
[root@Chauncey ~]#
sed替换时,遇到被替换的为路径的需要添加脱义符,或者使用其他字符代替分隔符
[root@Chauncey ~]# head passwd | sed 's/\/root/123/g' passwd
root:x:0:0:root:123:/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
[root@Chauncey ~]# head passwd | sed 's@/sbin@123@g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123/nologin
daemon:x:2:2:daemon:123:123/nologin
adm:x:3:4:adm:/var/adm:123/nologin
lp:x:4:7:lp:/var/spool/lpd:123/nologin
sed 删除一些字符时,也可以使用空来替换要删除的内容
[root@Chauncey ~]# 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::///://
::10:14::///://
在所有的行前边加上某些字符串:例子中的(,*)表示一整行,aaa:后边的&符号,指前边的小括号被替换的内容
[root@Chauncey ~]# head passwd | sed -r 's/(.*)/aaa:&/g'
aaa:root:x:0:0:root:/root:/bin/bash
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
aaa:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
sed列替换位置,首先要找到第一段和最后一段,例子以冒号为分割,则,第一段以非冒号为开头,(.*)为贪婪匹配,匹配多个冒号分割,最后一段也为非冒号开头,前边用括号括起来的,后边用数字表示她
[root@Chauncey ~]# cat 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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:SaslaUthd User:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
User1:x:500:500::/home/User1:/bin/bash
yeyunyi:x:501:0::/home/yeyunyi:/bin/bash
[root@Chauncey ~]# head passwd|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/bin/bash:x:0:0:root:/root:root
/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
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
[root@Chauncey ~]#