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

 

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