Shell学习(grep,sed)-2018.12.20

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 ~]# 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章