linux shell篇(五)正則表達(dá)式
來(lái)源:程序員人生 發(fā)布時(shí)間:2016-07-13 08:45:04 閱讀次數(shù):3153次
1.
正則表達(dá)式:
正則表達(dá)式 RE 、 Regular Expression
是1種字符模式,是在匹配文本時(shí),使用1些特殊符號(hào),匹配到用戶(hù)想要的東西
字符模式:
普通字符:沒(méi)有任何特殊含義的字符
元字符:具有特殊含義的字符 ^ $ * . [] () {}
正則表達(dá)式1般是夾在雙斜線之間的 如:/^abc/等
介紹
正則表達(dá)式元字符
元字符 功能 例子 匹配結(jié)果
^ 行首定位符 /^root/ 匹配以root開(kāi)頭的行
$ 行尾定位符 /sh$/ 匹配以sh結(jié)尾的行
. 匹配任意單個(gè)字符(除換行符) /l.ve/ 匹配live、love、... ...
* 前導(dǎo)符
匹配0個(gè)或多個(gè)它前面的模式 /l*ve/ 匹配ve、lve、llve、... ...
.* 匹配0到多個(gè)任意字符
[] 匹配1組字符中的任意1個(gè) /l[ioIO]ve/ 匹配live、love、lIve、lOve
[x-y] 匹配1段范圍中的任意1個(gè) /l[o-z]ve/ 匹配love、lpve、lqve、... ...、lzve
[0⑼] 數(shù)字
[a-z] 小寫(xiě)字母
[A-Z] 大寫(xiě)字母
[a-z0⑼] 小寫(xiě)字母或數(shù)字
[-+*/] +-*/ 4則運(yùn)算
[a-Z] 字母
[^] 表示取反 /^[^abc]ve/ 匹配除ave、bve、cve之外的3個(gè)字符的字符串
[^0⑼] 不是數(shù)字
\ 用于轉(zhuǎn)義元字符的 /93\.4/ 匹配93.4
\< 詞首定位符 /\<bin/ 匹配bin、binary、... ...
\> 詞尾定位符 /sh\>/ 匹配bash、csh、ksh、... ...
rootfs
模式的重復(fù){}
x\{m\} x是字符或字符串,m是數(shù)字,表示次數(shù)
匹配x出現(xiàn)m次 /a\{3\}/ 匹配到aaa
x\{m,\} 匹配x出現(xiàn)最少m次 /a\{3,\}/ 匹配aaa、aaaa、aaaaaaaa、aaaaaaa、... ...
x\{m,n\} 匹配x出現(xiàn)m次到n次 /a\{3,5\}/ 匹配aaa、aaaa、aaaaa
(root)
(a+(b-c)*d)
\(...\) 分組、標(biāo)簽
& \1 \2
/\(love\)/ \1r
\(root\).*\(bin\).*\2\1 \1ly
a and b
\(a\) and \(b\) ==> \2 and \1
2.
正則表達(dá)式用法
(1).vim與
正則表達(dá)式
1、查找替換(letter) tom換成mary
~# vim letter
:%s/\<[Tt]om\>/mary/ ——> tom Tom
2、行首行尾 picnic
/^love
/love$
3、任意字符 picnic
/l.ve
4、前導(dǎo)符 picnic
/o*v
5、范圍 picnic
/love[a-z]
6、取反 picnic
/love[^a-z]
7、綜合 invite
/^[A-Z]..$ 匹配Dan這1行
/^[A-Z][a-z]*.*3[0⑸] 匹配到There are around 30 to 35
//由此可以看出,
正則表達(dá)式履行的是最大匹配
8、標(biāo)簽
:%s/\(Ginger\) and \(Larry\)/\2 and \1/
:%s/\(Ginger\)\(.*\)\(Larry\)/\3\2\1/
s@@@ s### s%%% s/// 等價(jià)的
(2).grep與
正則表達(dá)式
GREP —— Global Regular Expression Print
好處:非交互
不影響原文件內(nèi)容,目的就是過(guò)濾出用戶(hù)感興趣的內(nèi)容
命令格式
grep [選項(xiàng)] "
正則表達(dá)式" 文件列表
grep履行狀態(tài)返回值3種
0:該文件中搜索到了匹配行
1:該文件中未搜索到匹配行
2: 搜索的文件不存在
~# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
~# echo $?
0
~# grep "roooot" /etc/passwd
~# echo $?
1
~# grep "root" /etc/passwd1
grep: /etc/passwd1: No such file or directory
~# echo $?
2
grep基本使用
設(shè)定別名
#alias grep='grep --color=auto'
# vim /etc/bashrc
1、--color 帶色彩顯示匹配到的關(guān)鍵字
~# grep --color "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2、-i 疏忽大小寫(xiě)
~# cat pass
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
~# grep "root" pass --color
Root:x:0:0:root:/root:/bin/bash
~# grep -i "root" pass --color
Root:x:0:0:root:/root:/bin/bash
3、-v 取反
~# grep -v "nologin" /etc/passwd //打印不包括nologin的行
4、^
打印/root/.bashrc文件中的注釋行
~# grep ^# /root/.bashrc
打印/etc/inittab文件中的非注釋行
~# grep -v ^# /etc/inittab
id:5:initdefault:
5、$
顯示passwd文件中以bash結(jié)尾的行
~# grep bash$ /etc/passwd
6、^$ 空行
~# grep -v ^$ /etc/rc.local
7、-c count 統(tǒng)計(jì)匹配到的行數(shù)
統(tǒng)計(jì)非空行的數(shù)量
~# grep -cv ^$ /etc/rc.local
7
統(tǒng)計(jì)空行的數(shù)量
~# grep -c ^$ /etc/rc.local
1
8、-r 遞歸檢索
9、-l 1般與-r聯(lián)用,只文顯示包括關(guān)鍵字的件名,而不是顯示文件內(nèi)容
~# grep -rl "if" /script/
/script/adduser1.sh
/script/if7.sh
/script/for9.sh
/script/fuwu.sh
/script/if1.sh
10、-q quiet 靜默輸出 1般在寫(xiě)腳本時(shí)候用
~# grep -q root /etc/passwd
~# echo $?
0
11、-n 顯示匹配行的行號(hào)
~# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
其他選項(xiàng)
-A
-B
-C
練習(xí):
1、顯示/etc/group文件中含有root的行
grep root /etc/group
2、顯示/etc/passwd中以rp開(kāi)頭的行
grep ^rp /etc/passwd
3、顯示/etc/group中不以:結(jié)尾的行
grep -v :$ /etc/group
4、顯示/etc/rc.local的空行及其行號(hào)
grep -n ^$ /etc/rc.local
5、顯示僅/mnt/cdrom目錄下的文件類(lèi)型為目錄的文件(不使用find)
ll /mnt/cdrom | grep ^d
grep 支持的
正則元字符
^ $ . * [] [^] \< \> \{\} \(\)
~# vim example1.txt
asdf
ad
bsd
nsd
a.d
5.6
b.c
bcc
aff
~# grep a.d example1.txt
asdf
a.d
~# grep "a\.d" example1.txt
a.d
~# grep a*d example1.txt
asdf
ad
bsd
nsd
a.d
練習(xí):/etc/passwd文件
1、匹配第2個(gè)字符是a的行
~# grep --color ^.a /etc/passwd
2、查找出/usr/bin目錄下具有suid權(quán)限的文件(不使用find)
~# ll /usr/bin/ | grep ^...[sS] --color
3、找出uid是兩位數(shù)的行
[0⑼][0⑼]
~# grep --color x:[0⑼][0⑼]: /etc/passwd
~# grep --color :[0⑼][0⑼]:[0⑼] /etc/passwd
4、顯示passwd文件中含有兩個(gè)bin的行
bin.*bin
~# grep --color "bin.*bin" /etc/passwd
~# grep --color "\<bin.*\<bin" /etc/passwd //僅僅是bin
bin:x:1:1:bin:/bin:/sbin/nologin
5、顯示passwd文件中含有3個(gè)root的行
~# grep "\(root\).*\1.*\1" /etc/passwd --color
root:x:0:0:root:/root:/bin/bash
6、顯示passwd文件中有9個(gè)連續(xù)的小寫(xiě)字母的行
[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]
[a-z]\{9\}
~# grep "[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" /etc/passwd --color
~# grep "[a-z]\{9\}" /etc/passwd --color
~# vim e2.txt
aabbcc
aaabbbccc
aaaannnmms
@@@##$
@@##@@
$$@#$%
1、找出e2.txt文件中含有3個(gè)連續(xù)的相同字符的行
~# grep "\(.\)\1\1" e2.txt --color
aaabbbccc
aaaannnmms
@@@##$
POSIX表示法
Portable Operating System Interface —— 可移植操作系統(tǒng)接口
也是適用于非英文環(huán)境的系統(tǒng),即適用于所有的語(yǔ)言環(huán)境
括號(hào)類(lèi) 含義 匹配范圍
[:space:] 包括換行符、空格、tab等所有空白字符
[:blank:] 空格和制表符 空格和tab
[:alpha:] 字母 a-zA-Z
[:alnum:] 字母和數(shù)字 a-Z0⑼
[:cntrl:] 控制字符 ctrl、backspace等等
[:lower:] 小寫(xiě)字母 a-z
[:upper:] 大寫(xiě)字母 A-Z
[:digit:] 10進(jìn)制數(shù) 0⑼
[:xdigit:] 106進(jìn)制數(shù) 0⑼a-fA-F
[:punct:] 標(biāo)點(diǎn)符號(hào) ,.?:' "
[^[:alpha:]] 取反,表示不是字母
~# grep "[[:space:]]\.[[:digit:]][[:space:]]" datafile --color
southwest
SW
Lewis Dalsass
2.7
.8
218
southeast
SE
Patricia Hemenway
4.0
.7
417
| 或
? 表示0個(gè)或1個(gè)它前面的字符 a?d ==> d ad
+ 表示1個(gè)或多個(gè)它前面的字符 a+d ==> ad aad aaad ... ...
()
x{m}
x{m,}
x{m,n}
|
顯示datafile文件中含有NW或是WE的行
~# egrep "NW|WE" datafile --color
~# grep -E "NW|WE" datafile --color
?
~# egrep "2\.?[0⑼]" datafile --color
+
~# egrep "a+" e2.txt --color
aabbcc
aaabbbccc
aaaannnmms
3.sed
sed 流編輯器 stream editor
是1種非交互式文本編輯器,默許是不會(huì)修改原文件的
工作原理
1行1行處理的
從文件的第1行開(kāi)始讀取,放到模式空間中進(jìn)行相應(yīng)處理,處理完將結(jié)果輸出到屏幕上,然后繼續(xù)讀取下1行,直到所有的行都處理終了,sed結(jié)束。
sed1般用于處理大文件。
語(yǔ)法:
sed [選項(xiàng)] 'AddressCommand' 文件列表
1、經(jīng)常使用的選項(xiàng)
-n:靜默輸出,關(guān)閉模式空間的輸出,1般與p1起用
-e:允許進(jìn)行多項(xiàng)編輯,也就是說(shuō)對(duì)同1行做屢次處理、也能夠做多點(diǎn)編輯
-e '動(dòng)作' -e '動(dòng)作' 等價(jià)于 '動(dòng)作1;動(dòng)作2'
-f sed腳本 : 指定運(yùn)行的sed腳本的
-r:允許使用擴(kuò)大
正則
-i:直接修改原文件
2、Address : 定址、地址
1)單獨(dú)的行號(hào)
如: 1 就表示要處理第1行
$ 表示最后1行
2)起始行,結(jié)束行
如: 1,5 處理第1行到第5行
3)/
正則表達(dá)式/
如:/^root/ 處理以root開(kāi)頭的行
4)/
正則表達(dá)式1/,/
正則表達(dá)式2/ 最小匹配
表示處理從匹配到
正則表達(dá)式1的行開(kāi)始,到第1次匹配到
正則表達(dá)式2之間的所有行
如果
正則表達(dá)式1匹配到了,
正則表達(dá)式2未匹配到,那末就從匹配到
正則表達(dá)式1的行開(kāi)始,1直處理到文件結(jié)束
如果
正則表達(dá)式1未匹配到,那末就不對(duì)文件做處理。
如:/^bin/,/bash$/
binsdadaddaddass
dsfasidsfdhfj09bash
dasdasdasdf--bash
5)起始位置,+N 不是特別經(jīng)常使用
表示從起始位置開(kāi)始,后面的N行都處理
如:3,+5 處理3⑻行
3、Command
經(jīng)常使用的:d p s y q
其他的:a c i r w
h H g G
1)d:刪除
~# sed '/UUID/d' /etc/fstab
~# sed '1,5d' /etc/fstab
~# sed '$d' /etc/fstab
~# sed '/tmp/,/sfs/d' /etc/fstab
~# sed '/UUID/,+5d' /etc/fstab
刪除從第5行開(kāi)始到最后1行的所有內(nèi)容
~# sed '5,$d' /etc/passwd
2)p:打印
~# cat -n /etc/passwd | head > pass
~# sed 'p' pass //每行會(huì)打印兩遍,1遍是處理結(jié)果,1遍是模式空間的輸出
~# sed -n 'p' pass //只會(huì)打印1遍,由于模式空間的輸出被關(guān)閉了
~# sed -n '3,5p' pass // 打印文件的3到5行
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
~# sed -n '3p' pass
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
! 非
~# sed '3!d' pass //等價(jià)于打印第3行
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
練習(xí):
用sed分別實(shí)現(xiàn)head ⑴ 和 tail ⑴的功能
head ⑴
~# sed -n '1p' pass
1
root:x:0:0:root:/root:/bin/bash
~# sed '1!d' pass
1
root:x:0:0:root:/root:/bin/bash
tail ⑴
~# sed -n '$p' pass
10
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
~# sed '$!d' pass
10
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
3)r 讀取
~# sed '/^root/r /etc/issue' /etc/passwd
1
root:x:0:0:root:/root:/bin/bash
Red Hat Enterprise Linux Server release 6.4 (Santiago)
Kernel \r on an \m
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
4)w 寫(xiě)
~# sed '/root/w /tmp/douni' pass //將匹配到的行另存到文件中
~# cat /tmp/douni
1
root:x:0:0:root:/root:/bin/bash
5)a 追加 在匹配到的行的下1行插入內(nèi)容
~# sed '/root/a hello root' pass | head ⑸
1
root:x:0:0:root:/root:/bin/bash
hello root
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
在文件的最后1行插入新內(nèi)容
~# sed '$a The End' pass
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
The End
6)i 插入 在匹配行的上1行插入內(nèi)容
~# sed '/daemon/i SO COOL' pass | head ⑸
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
SO COOL
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
~# sed '1i BEGINNING' pass | head ⑸ //在第1行插入內(nèi)容
BEGINNING
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
7)c 修改 本行替換,將匹配到的行的內(nèi)容替換成新內(nèi)容
~# sed '/root/c ROOT' pass
1 ROOT
ROOT:x:0:0:root
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
~# sed '/IPADDR/c IPADDR=172.16.254.201' /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=172.16.254.201
NETMASK=255.255.0.0
GATEWAY=172.16.254.1
8)y 轉(zhuǎn)換的命令,對(duì)應(yīng)替換
y///
y/123/ABC/
~# sed 'y/1234/ABCF/' pass
A
root:x:0:0:root:/root:/bin/bash
B
bin:x:A:A:bin:/bin:/sbin/nologin
C
daemon:x:B:B:daemon:/sbin:/sbin/nologin
F
adm:x:C:F:adm:/var/adm:/sbin/nologin
5
lp:x:F: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:AB:mail:/var/spool/mail:/sbin/nologin
A0
uucp:x:A0:AF:uucp:/var/spool/uucp:/sbin/nologin
將文件中所有的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母
~# sed 'y/qwertyuiopasdfghjklzxcvbnm/QWERTYUIOPASDFGHJKLZXCVBNM/' pass
9)n next 處理匹配行的下1行,用的較少
~# sed -n '/root/p' pass
1
root:x:0:0:root:/root:/bin/bash
~# sed -n '/root/{n;p}' pass //{}里面寫(xiě)多個(gè)命令,之間用分號(hào)分隔
2
bin:x:1:1:bin:/bin:/sbin/nologin
10)q 退出 不再向模式空間讀入新行
~# sed '/^bin/q' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
~# sed '1q' pass //head ⑴的又1種方法
1
root:x:0:0:root:/root:/bin/bash
練習(xí):
1、將pass文件每行打印3次
~# sed 'p;p' pass
2、打印passwd文件的第1行和第3行(多點(diǎn)編輯,用分號(hào)分隔命令)
~# sed -n '1p;3p' pass
1
root:x:0:0:root:/root:/bin/bash
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
~# sed -n -e '1p' -e '3p' pass
3、使用sed修改selinux的模式為permissive
~# sed '7c SELINUX=permissive' /etc/selinux/config
4、使用sed永久修改主機(jī)名為shell
~# sed '$c HOSTNAME=shell' /etc/sysconfig/network
3、刪除pass文件的第1行和最后1行
~# sed '1d;$d' pass
以下操作datafile文件
4、在匹配到Lewis的行的下1行插入“has Lewis”
~# sed '/Lewis/a has Lewis' datafile
5、在文件的第1行插入“employee's information”
~# sed "1i employee's information" datafile
11)s 查找替換
定址s/模式匹配(舊的內(nèi)容)/新的內(nèi)容/[修飾符]
s@@@ s### s%%%
修飾符:
g:全局替換,1行中的多個(gè)
n:n為數(shù)字,1⑸12 替換第n個(gè)匹配到的內(nèi)容
p:打印
w:另存為,寫(xiě)
~# sed 's/root/ROOT/' pass | head ⑶ //默許只替換第1次匹配到的
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
~# sed 's/root/ROOT/2' pass | head ⑶ //替換每行中第2個(gè)匹配到的
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
~# sed 's/root/ROOT/g' pass | head ⑶ //全部替換
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
練習(xí):
1、從以root開(kāi)頭,到以login結(jié)尾的行,將sbin替換成bin (/etc/passwd)
~# sed '/^root/,/login$/s/sbin/bin/' /etc/passwd | head
2、將格式為2015/09/02的日期,替換為2015; 09; 02的格式(注意分號(hào)后面有空格)
~# date "+%Y/%m/%d"
2015/09/02
~# date "+%Y/%m/%d" | sed 's#/#; #g'
2015; 09; 02
~# date "+%Y/%m/%d" | sed 's/\//; /g'
3、將selinux配置文件中的disabled替換為enforcing,暫時(shí)不作用于原文件
~# sed '/SELINUX/s/disabled/enforcing/' /etc/selinux/config
思考題:刪除文件中所有的數(shù)字 **** //1種思想,用替換去刪除字符等
~# sed 's/[0⑼]//g' pass
-i:直接作用于文件
~# sed 's/static/dhcp/' /etc/sysconfig/network-scripts/ifcfg-eth0
~# sed -i 's/static/dhcp/' /etc/sysconfig/network-scripts/ifcfg-eth0
~# sed -i.bak 's/dhcp/static/' /etc/sysconfig/network-scripts/ifcfg-eth0
//.bak是備份文件的后綴名
~# ls /etc/sysconfig/network-scripts/ifcfg-eth0*
ifcfg-eth0 ifcfg-eth0.bak
模式匹配時(shí)的特殊符號(hào)
^:每行的開(kāi)頭
給全文加注釋
~# sed 's/^/#/' pass
在第8到10行的開(kāi)頭每行加上###
~# sed 's/^/###/' pass
$:每行的結(jié)尾
在匹配到root的行的末尾添加###
~# sed '/root/s/$/###/' pass
1
root:x:0:0:root:/root:/bin/bash###
-r選項(xiàng): 支持?jǐn)U大
正則
~# sed -r 's/[[:space:]]+//' pass
~# sed 's/[[:space:]]*//' pass
1、將history命令履行結(jié)果中編號(hào)前面的空白字符刪掉
~# history | sed -r 's/[[:space:]]+//'
2、刪除文件中的空行和空白行
~# cat txt
adadadadada dasdasdadas
dadada
gdfgdgdfgfdg
~# cat -A txt
adadadadada dasdasdadas$
$
$
dadada $
^I^I $
gdfgdgdfgfdg$
~# sed -r '/^$/d;/^[[:space:]]+$/d' txt
adadadadada dasdasdadas
dadada
gdfgdgdfgfdg
& 援用 用來(lái)代替匹配到的模式的
將每行的行號(hào)加上括號(hào)
~# sed -r 's/[0⑼]+/(&)/' pass
~# vim test
hello, i like you
hi, my love
like ==> liker
love ==> lover
~# sed 's/l..e/l..er/' test
hello, i liker you
hi, my lover
~# sed -r 's/(l..e)/\1r/' test
hello, i liker you
hi, my lover
like ==> Like
love ==> Love
~# sed -r 's/l(..e)/L\1/' test
hello, i Like you
hi, my Love
練習(xí):
1、刪除每行的第1個(gè)字符
2、刪除每行的第2個(gè)字符
3、刪除每行的倒數(shù)第1個(gè)字符
4、刪除每行的倒數(shù)第2個(gè)字符
5、交換每行的第1個(gè)和第2個(gè)字符
思考:
刪除/etc/passwd每行的第1個(gè)字段
交換/etc/passwd文件的第1個(gè)和第2個(gè)字段
作業(yè):
1、將/etc/inittab文件中的id:5:initdefault中的5替換成3
以下使用datafile3
1、將Jon的名字改成Jonathan
2、刪除文件的前3行
3、打印文件的第5到10行
4、刪除含有Lane的行
5、打印生日在11月和12月的行
6、在以Fred開(kāi)頭的行末尾添加3個(gè)*
7、將所有包括Jose的行替換為Match Jose
8、把Popeye的生日改成11/14/46,條件:需要你先匹配誕生日
9、刪除所有的行
10、將文件中的所有大寫(xiě)字母用括號(hào)()括起來(lái)
每多少行操作1次
first~step
first:起始行號(hào)
step:步長(zhǎng)
打印偶數(shù)行
~# sed -n '2~2p' pass
2
bin:x:1:1:bin:/bin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
6
sync:x:5:0:sync:/sbin:/bin/sync
8
halt:x:7:0:halt:/sbin:/sbin/halt
10
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
每3行打印1次
~# sed -n '1~3p' pass
1
root:x:0:0:root:/root:/bin/bash
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
7
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
=:打印當(dāng)前行號(hào)
統(tǒng)計(jì)文件的行數(shù)
~# sed -n '$=' /etc/passwd
76
~# vim sc1.sed
/Lewis/a \
hello everyone \
ni hao
/Suan/c has suan
1i \
************** \
begin \
**************
$d
調(diào)用腳本
~# sed -f sc1.sed datafile
**************
begin
**************
northwest
NW
Charles Main
3.0
.98
334
western
WE
Sharon Gray
5.3
.97
5 23
southwest
SW
Lewis Dalsass
2.7
.8
218
hello everyone
ni hao
has suan
southeast
SE
Patricia Hemenway
4.0
.7
417
eastern
EA
TB Savage
4.4
.84
520
northeast
NE
AM Main Jr.
5.1
.94
313
western
WE
Sharon Gray
5.3
.97
5 23
north
NO
Margot Weber
4.5
.89
59
模式空間
用于處理文本行的
PATT,最多能夠存儲(chǔ)8192字節(jié)
保存空間
用于保存文本行的
HOLD,sed用來(lái)保存已處理過(guò)的文本行的,最多保存8192字節(jié),默許有1個(gè)空行
觸及到的命令
h:將模式空間的內(nèi)容復(fù)制到保存空間 —— 覆蓋模式
H:將模式空間的內(nèi)容追加到保存空間 —— 追加模式
g:將保存空間的內(nèi)容復(fù)制到模式空間 —— 覆蓋模式
G:將保存空間的內(nèi)容追加到模式空間 —— 追加模式
x:將模式空間的內(nèi)容和保存空間的內(nèi)容進(jìn)行交換
交換第1行和第2行的內(nèi)容
~# sed '1{h;d};2G' pass | head ⑸
2
bin:x:1:1:bin:/bin:/sbin/nologin
1
root:x:0:0:root:/root:/bin/bash
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
將第1行到第3行的內(nèi)容復(fù)制到第4行后面
~# sed '1h;2,3H;4G' pass | head
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
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
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
將第1行到第3行的內(nèi)容剪切到第4行的后面
~# sed '1{h;d};2,3{H;d};4G' pass
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
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
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
在每行的下面添加1個(gè)空行
~# sed 'G' pass
思考:倒序輸出文件的每行
假定文件以下:
aa
bb
cc
dd
要求輸出結(jié)果以下:
dd
cc
bb
aa
4.awk
awk 1種編程語(yǔ)言、文本編輯器、也是1種非交互式的編輯器
功能:對(duì)文本數(shù)據(jù)進(jìn)行匯總和處理,是1個(gè)報(bào)告的生成器,能夠?qū)?shù)據(jù)進(jìn)行排版
awk nawk gawk posix awk
nawk —— solaris
gawk,awk —— GNU Linux
工作進(jìn)程
將文件中的內(nèi)容逐行的進(jìn)行掃描,把整行內(nèi)容存入內(nèi)置變量$0中;
再依照指定的分隔符(默許的分隔符是空白)將輸入行切成若干個(gè)列(字段),存入變量$1~$100,再使用命令(print、printf)將變量打印輸出,輸出分隔符默許也是空白
再讀取下1行,循環(huán)處理,直到文件處理結(jié)束。
~# ifconfig eth0 | grep Bcast | awk '{print $2}' | awk -F: '{print $2}'
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)