溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

shell腳本之正則表達(dá)式(二)---sed工具

發(fā)布時(shí)間:2020-08-10 19:39:44 來(lái)源:網(wǎng)絡(luò) 閱讀:490 作者:caozhengtao1213 欄目:系統(tǒng)運(yùn)維

sed工具

sed是一個(gè)強(qiáng)大而簡(jiǎn)單的文本解析轉(zhuǎn)換工具,可以讀取文本,并根據(jù)指定的條件對(duì)文本內(nèi)容進(jìn)行編輯(刪除、替換、添加、移動(dòng)等),最后輸出所有行或者僅輸出處理的某些行。sed 也可以在無(wú)交互的情況下實(shí)現(xiàn)相當(dāng)復(fù)雜的文本處理操作,被廣泛應(yīng)用于 Shell 腳本中,用以完成各種自動(dòng)化處理任務(wù)。



sed工作流程

1.讀取:sed 從輸入流(文件、管道、標(biāo)準(zhǔn)輸入)中讀取一行內(nèi)容并存儲(chǔ)到臨時(shí)的緩沖區(qū)中。
2.執(zhí)行:默認(rèn)情況下,所有的 sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則 sed 命令將會(huì)在所有的行上依次執(zhí)行。
3.顯示:發(fā)送修改后的內(nèi)容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會(huì)被清空。



sed命令用法

sed[選項(xiàng)] '操作' 參數(shù)
sed [選項(xiàng)] -f scriptfile 參數(shù)

常見的 sed 命令選項(xiàng)

-e 或--expression=:表示用指定命令或者腳本來(lái)處理輸入的文本文件。
-f 或--file=:表示用指定的腳本文件來(lái)處理輸入的文本文件。
-h 或--help:顯示幫助。
-n、--quiet 或 silent:表示僅顯示處理后的結(jié)果。
-i:直接編輯文本文件。

“操作”用于指定對(duì)文件操作的動(dòng)作行為,也就是 sed 的命令。通常情況下是采用的“[n1[,n2]]”操作參數(shù)的格式。n1、n2 是可選的,不一定會(huì)存在,代表選擇進(jìn)行操作的行數(shù)


常見的操作選項(xiàng)

a:增加,在當(dāng)前行下面增加一行指定內(nèi)容。
c:替換,將選定行替換為指定內(nèi)容。
d:刪除,刪除選定的行。
i:插入,在選定行上面插入一行指定內(nèi)容。
p:打印,如果同時(shí)指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容;如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n”選項(xiàng)一起使用。
s:替換,替換指定字符。
y:字符轉(zhuǎn)換。

用法演示

1.輸出符合條件的文本(p 表示正常輸出)

[root@localhost opt]# sed -n 'p' /etc/passwd       //輸出所有內(nèi)容,等同于cat的用法
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
......
sed -n '5p' /etc/passwd        //輸出第5行的內(nèi)容
sed -n '3,5p'  /etc/passwd        //輸出3到5行的內(nèi)容
sed -n 'p;n' /etc/passwd        //輸出所有奇數(shù)行的內(nèi)容,n表示讀入下一行資料
sed -n 'n;p'  /etc/passwd        //輸出所有偶數(shù)行的內(nèi)容
sed -n '1,5{p;n}' /etc/passwd  //輸出1~5行間的奇數(shù)行
 sed -n '22,${n;p}' /etc/passwd  //輸出第22行至行位間的偶數(shù)行

以上是 sed 命令的基本用法,sed 命令結(jié)合正則表達(dá)式時(shí),格式略有不同,正則表達(dá)式以“/”包圍。


sed 命令與正則表達(dá)式結(jié)合使用

[root@localhost opt]# sed -n '/sbin/p' /etc/passwd       //輸出包含sbin的行
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
......

[root@localhost opt]# sed -n '2,/sbin/p' /etc/passwd       //輸出從第2行開始至第一個(gè)包含sbin的行      
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost opt]# sed -n '/sbin/=' /etc/passwd       //輸出包含sbin所在的行號(hào),等號(hào)(=)用來(lái)輸出行號(hào)
2
3
4
5
6
7
8
......

[root@localhost opt]# sed -n '/^ssh/p' /etc/passwd      //輸出以ssh開頭的行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

[root@localhost opt]# sed -n '/[0-9]$/p' test.txt       //輸出以數(shù)字結(jié)尾的行
PI=3.141592653589793238462643383249901429

[root@localhost opt]# sed -n '/\<wood\>/p' test.txt       //輸出包含單詞wood 的行,\<、\>代表單詞邊界
a wood cross!

2.刪除符合條件的文本(d)
下面命令中 nl 命令用于計(jì)算文件的行數(shù),結(jié)合該命令可以更加直觀地查看到命令執(zhí)行的結(jié)果。

nl test.txt | sed '3d'       //刪除第 3 行
nl test.txt | sed '3,5d'         //刪除第 3~5 行
nl test.txt |sed '/cross/d'      //刪除包含cross 的行 
sed '/^[a-z]/d' test.txt           //刪除以小寫字母開頭的行
sed '/\.$/d' test.txt             //刪除以"."結(jié)尾的行
sed '/^$/d' test.txt              //刪除所有空行


[root@localhost opt]# nl test.txt | sed '3,5d'
1 he was short and fat.
2 He was wearing a blue polo shirt with black pants.
6   The year ahead will test our political establishment to the limit. 7    PI=3.141592653589793238462643383249901429
注意: 若是刪除重復(fù)的空行,即連續(xù)的空行只保留一個(gè), 執(zhí)行“ sed –e ‘/^$/{n;/^$/d}’test.txt”命令即可實(shí)現(xiàn)。其效果與“cat -s test.txt”相同,n 表示讀下一行數(shù)據(jù)。

3.替換符合條件的文本
用 sed 命令進(jìn)行替換操作時(shí)需要用到 s(字符串替換)、c(整行/整塊替換)、y(字符轉(zhuǎn)換)命令選項(xiàng)

sed 's/the/THE/' test.txt       //將每行中的第一個(gè)the 替換為 THE 
sed 's/l/L/3' test.txt              //將每行中的第 3 個(gè)l 替換為L(zhǎng)
sed 's/the/THE/g' test.txt          //將文件中的所有the 替換為THE
sed 's/o//g' test.txt                //將文件中的所有o 刪除(替換為空串)
sed 's/^/#/' test.txt                //在每行行首插入#號(hào)
sed '/the/s/^/#/' test.txt            //在包含the 的每行行首插入#號(hào)
sed 's/$/EOF/' test.txt                 //在每行行尾插入字符串EOF 
sed '3,5s/the/THE/g' test.txt             //將第 3~5 行中的所有the 替換為 THE
sed '/the/s/o/O/g' test.txt             //將包含the 的所有行中的o 都替換為 O

4.遷移符合條件的文本

H        復(fù)制到剪貼板 ;
g   G   將剪貼板中的數(shù)據(jù)覆蓋/追加至指定行;
w        保存為文件;
r         讀取指定文件;
a,     追加指定內(nèi)容。

sed '/the/{H;d};$G' test.txt          //將包含the 的行遷移至文件末尾,{;}用于多個(gè)操作sed '1,5{H;d};17G' test.txt         //將第 1~5 行內(nèi)容轉(zhuǎn)移至第 17 行后
sed '/the/w out.file' test.txt        //將包含the 的行另存為文件out.file
sed '/the/r /etc/hostname' test.txt       //將文件/etc/hostname 的內(nèi)容添加到包含the 的每行以后
sed '3aNew' test.txt      //在第 3 行后插入一個(gè)新行,內(nèi)容為 New 
sed '/the/aNew' test.txt          //在包含the 的每行后插入一個(gè)新行,內(nèi)容為 New sed '3aNew1\nNew2' test.txt         //在第 3 行后插入多行內(nèi)容,中間的\n 表示換行

5.使用腳本編輯文件
在用 sed 腳本,可將多個(gè)編輯指令存放到文件中(每行一條編輯指令),通過(guò)“-f”選項(xiàng)來(lái)調(diào)用。

sed '1,6{H;d};18G' test.txt //將第 1~6行內(nèi)容轉(zhuǎn)移至第 18 行后
[root@localhost opt]# vim try.list
1,6H
1,6d
18G

[root@localhost opt]# sed -f  try.list test.txt

6.sed 直接操作文件
編寫一個(gè)腳本,用來(lái)調(diào)整 vsftpd 服務(wù)配置:禁止匿名用戶,但允許本地用戶(也允許寫入)。

[root@localhost opt]#  vim aaa.sh
#!/bin/bash
# 指定樣本文件路徑、配置文件路徑
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"

# 備份原來(lái)的配置文件,檢測(cè)文件名為/etc/vsftpd/vsftpd.conf.bak 備份文件是否存在, 若不存在則使用 cp 命令進(jìn)行文件備份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于樣本配置進(jìn)行調(diào)整,覆蓋現(xiàn)有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e'/^write_enable/s/NO/YES/g' $CONFIG 
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 啟動(dòng)vsftpd 服務(wù),并設(shè)為開機(jī)后自動(dòng)運(yùn)行
systemctl restart vsftpd
systemctl enable vsftpd

[root@localhost opt]#  chmod +x aaa.sh 
[root@localhost opt]#  ./aaa.sh 
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI