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