
本篇主要寫一些shell腳本文本處理工具sed的使用,
概述
sed(Stream EDitor)是一個強大而簡單的文本決議轉換工具,可以讀取文本,并根據指定的條件對文本內容進行編輯(洗掉、替換、添加、移動等),最后輸出所有行或者僅輸出處理的某些行,
sed也可以在無互動的情況下實作相復雜的文本處理操作,被廣泛應用于Shell腳本中,用以完成各種自動化處理任務,
sed的作業流程主要包括讀取、執行和顯示三個程序:
- 讀取:
sed從輸入流(檔案、管道、標準輸入)中讀取一行內容并存盤到臨時的緩沖區中(又稱模式空間,pattern space) - 執行:默認情況下,所有的
sed命令都在模式空間中順序地執行,除非指定了行的地址,否則sed命令將會在所有的行上依次執行 - 顯示:發送修改后的內容到輸出流,再發送資料后,模式空間將會被清空
在所有的檔案內容都被處理完成之前,上述程序將重復執行,直至所有內容被處理完,
默認情況下,所有的sed命令都是在模式空間內執行的,因此輸入的檔案并不會發生任何變化,除非是用重定向存盤輸出,
命令常見用法
- 命令有兩種格式:
sed [選項] '編輯指令' 檔案1 檔案2...
sed [選項] -f 腳本檔案 檔案1 檔案2...
- 常見的命令選項
-e或--expression=:表示用指定命令或者腳本來處理輸入的文本檔案
-f或--file=:表示用指定的腳本檔案來處理輸入的文本檔案
-h或--help:顯示幫助
-n、--quiet或silent:表示僅顯示處理后的結果
-i:直接編輯文本檔案
- 操作
通常情況下是采用的[n1[,n2]]操作引數的格式,
a:增加,在當前行下面增加一行指定內容
c:替換,將選定行替換為指定內容
d:洗掉,洗掉選定的行
i:插入,在選定行上面插入一行指定內容
p:列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有內容;如果有非列印字符,則以ASCII碼輸出,其通常與-n選項一起使用
s:替換,替換指定字符
y:字符轉換
示例
輸出符合條件的文本“p”
- 輸出所有內容,等同于
cat test.txt
[root@localhost ~]# sed -n 'p' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 輸出第
3行
[root@localhost ~]# sed -n '3p' test.txt
The home of Football on BBC Sport online.
- 輸出
3~5行
[root@localhost ~]# sed -n '3,5p' test.txt
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
- 輸出所有奇數行,
n表示讀入下一行資料
[root@localhost ~]# sed -n 'p;n' test.txt
he was short and fat.
The home of Football on BBC Sport online.
google is the best tools for search keyword.
PI=3.141592653589793238462643383249901429
Actions speak louder than words
#woooooood #
I bet this place is really spooky late at night!
I shouldn't have lett so tast.
- 輸出所有偶數行,
n表示讀入下一行資料
[root@localhost ~]# sed -n 'n;p' test.txt
He was wearing a blue polo shirt with black pants.
the tongue is boneless but it breaks bones.12!
The year ahead will test our political establishment to the limit.
a wood cross!
#woood #
AxyzxyzxyzxyzC
Misfortunes never come alone/single.
- 輸出第
1~5行之間的奇數行(1,3,5)
[root@localhost ~]# sed -n '1,5{n;p}' test.txt
He was wearing a blue polo shirt with black pants.
the tongue is boneless but it breaks bones.12!
The year ahead will test our political establishment to the limit.
- 輸出第
10行至檔案尾之間的偶數行(11,13,15)
[root@localhost ~]# sed -n '10,${n;p}' test.txt
#woooooood #
I bet this place is really spooky late at night!
I shouldn't have lett so tast.
sed命令結合正則運算式時,格式略有不同,正則運算式以/包圍,
- 輸出包含
the的行
[root@localhost ~]# sed -n '/the/p' test.txt
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
- 輸出從第
4行至第一個包含the的行
[root@localhost ~]# sed -n '4,/the/p' test.txt
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
- 輸出包含
the的行所在的行號,等號=用來輸出行號
[root@localhost ~]# sed -n '/the/=' test.txt
4
5
6
- 輸出以
PI開頭的行
[root@localhost ~]# sed -n '/^PI/p' test.txt
PI=3.141592653589793238462643383249901429
- 輸出以數字結尾的行
[root@localhost ~]# sed -n '/[0-9]$/p' test.txt
PI=3.141592653589793238462643383249901429
- 輸出包含單詞
wood的行,\<、\>代表單詞邊界
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt
a wood cross!
洗掉符合條件的文本“d”
nl命令用來計算檔案的行數
- 洗掉第
3行
[root@localhost ~]# nl test.txt | sed '3d'
1 he was short and fat.
2 He was wearing a blue polo shirt with black pants.
4 the tongue is boneless but it breaks bones.12!
5 google is the best tools for search keyword.
6 The year ahead will test our political establishment to the limit.
7 PI=3.141592653589793238462643383249901429
8 a wood cross!
9 Actions speak louder than words
10 #woood #
11 #woooooood #
12 AxyzxyzxyzxyzC
13 I bet this place is really spooky late at night!
14 Misfortunes never come alone/single.
15 I shouldn't have lett so tast.
- 洗掉第
3~5行
[root@localhost ~]# 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
8 a wood cross!
9 Actions speak louder than words
10 #woood #
11 #woooooood #
12 AxyzxyzxyzxyzC
13 I bet this place is really spooky late at night!
14 Misfortunes never come alone/single.
15 I shouldn't have lett so tast.
- 洗掉包含
cross的行,原本的第8行被洗掉
[root@localhost ~]# nl test.txt | sed '/cross/d'
1 he was short and fat.
2 He was wearing a blue polo shirt with black pants.
3 The home of Football on BBC Sport online.
4 the tongue is boneless but it breaks bones.12!
5 google is the best tools for search keyword.
6 The year ahead will test our political establishment to the limit.
7 PI=3.141592653589793238462643383249901429
9 Actions speak louder than words
10 #woood #
11 #woooooood #
12 AxyzxyzxyzxyzC
13 I bet this place is really spooky late at night!
14 Misfortunes never come alone/single.
15 I shouldn't have lett so tast.
- 洗掉不包含
cross的行,用!符號表示取反操作
[root@localhost ~]# nl test.txt | sed '/cross/!d'
8 a wood cross!
- 洗掉以小寫字母開頭的行
[root@localhost ~]# sed '/^[a-z]/d' test.txt
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 洗掉以
.結尾的行
[root@localhost ~]# sed '/\.$/d' test.txt
the tongue is boneless but it breaks bones.12!
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
- 洗掉所有空行
[root@localhost ~]# sed '/^$/d' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 洗掉重復的空行,即連續空行只保留一個
[root@localhost ~]# sed '/^$/{n;/^$/d}' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
[root@localhost ~]# cat -s test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
替換符合條件的文本
s(字串替換)
c(整行/整塊替換)
y(字符轉換)
- 將每行中的第一個
the替換為THE
[root@localhost ~]# sed 's/the/THE/' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
THE tongue is boneless but it breaks bones.12!
google is THE best tools for search keyword.
The year ahead will test our political establishment to THE limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 將每行中的第
3個l替換為L
[root@localhost ~]# sed 's/l/L/3' test.txt
he was short and fat.
He was wearing a blue polo shirt with bLack pants.
The home of Football on BBC Sport onLine.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our poLitical establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is realLy spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 將檔案中的所有
the替換為THE
[root@localhost ~]# sed 's/the/THE/g' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
THE tongue is boneless but it breaks bones.12!
google is THE best tools for search keyword.
The year ahead will test our political establishment to THE limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 將檔案中的所有
o洗掉(替換為空串)
[root@localhost ~]# sed 's/o//g' test.txt
he was shrt and fat.
He was wearing a blue pl shirt with black pants.
The hme f Ftball n BBC Sprt nline.
the tngue is bneless but it breaks bnes.12!
ggle is the best tls fr search keywrd.
The year ahead will test ur plitical establishment t the limit.
PI=3.141592653589793238462643383249901429
a wd crss!
Actins speak luder than wrds
#wd #
#wd #
AxyzxyzxyzxyzC
I bet this place is really spky late at night!
Misfrtunes never cme alne/single.
I shuldn't have lett s tast.
- 在每行行首插入
#號
[root@localhost ~]# sed 's/^/#/' test.txt
#he was short and fat.
#He was wearing a blue polo shirt with black pants.
#The home of Football on BBC Sport online.
#the tongue is boneless but it breaks bones.12!
#google is the best tools for search keyword.
#The year ahead will test our political establishment to the limit.
#PI=3.141592653589793238462643383249901429
#a wood cross!
#Actions speak louder than words
#
#
##woood #
##woooooood #
#AxyzxyzxyzxyzC
#I bet this place is really spooky late at night!
#Misfortunes never come alone/single.
#I shouldn't have lett so tast.
- 在包含
the的每行行首插入#號
[root@localhost ~]# sed '/the/s/^/#/' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
#the tongue is boneless but it breaks bones.12!
#google is the best tools for search keyword.
#The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 在每行行尾插入字串
EOF
[root@localhost ~]# sed 's/$/EOF/' test.txt
he was short and fat.EOF
He was wearing a blue polo shirt with black pants.EOF
The home of Football on BBC Sport online.EOF
the tongue is boneless but it breaks bones.12!EOF
google is the best tools for search keyword.EOF
The year ahead will test our political establishment to the limit.EOF
PI=3.141592653589793238462643383249901429EOF
a wood cross!EOF
Actions speak louder than wordsEOF
EOF
EOF
#woood #EOF
#woooooood #EOF
AxyzxyzxyzxyzCEOF
I bet this place is really spooky late at night!EOF
Misfortunes never come alone/single.EOF
I shouldn't have lett so tast.EOF
- 將第
3~5行中的所有the替換為THE
[root@localhost ~]# sed '3,5s/the/THE/g' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
THE tongue is boneless but it breaks bones.12!
google is THE best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 將包含
the的所有行中的o都替換為O
[root@localhost ~]# sed '/the/s/o/O/g' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tOngue is bOneless but it breaks bOnes.12!
gOOgle is the best tOOls fOr search keywOrd.
The year ahead will test Our pOlitical establishment tO the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
遷移符合條件的文本
H(復制到剪貼板)
g、G(將剪貼板中的資料覆寫/追加至指定行)
w(保存為檔案)
r(讀取指定檔案)
a(追加指定內容)
- 將包含
the的行遷移至檔案末尾,{;}用于多個操作
[root@localhost ~]# sed '/the/{H;d};$G' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
- 將第
1~5行內容轉移至第17行后
[root@localhost ~]# sed '1,5{H;d};17G' test.txt
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
- 將包含
the的行另存為檔案out.file
[root@localhost ~]# sed '/the/w out.file' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
[root@localhost ~]# cat out.file
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
- 將檔案
/etc/hostname的內容添加到包含the的每行以后
[root@localhost ~]# sed '/the/r /etc/hostname' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
localhost.localdomain
google is the best tools for search keyword.
localhost.localdomain
The year ahead will test our political establishment to the limit.
localhost.localdomain
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 在第
3行后插入一個新行,內容為New
[root@localhost ~]# sed '3aNew' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
New
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 在包含
the的每行后插入一個新行,內容為New
[root@localhost ~]# sed '/the/aNew' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
New
google is the best tools for search keyword.
New
The year ahead will test our political establishment to the limit.
New
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
- 在第
3行后插入多行內容,中間的\n表示換行
[root@localhost ~]# sed '3aNew1\nNew2' test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
New1
New2
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
使用腳本編輯檔案
將多個編輯指令存放到檔案中(每行一條編輯指令),通過-f選項來呼叫
- 將第
1~5行內容轉移至第17行后,以上操作可以改用腳本檔案方式:
[root@localhost ~]# vim opt.list
1,5H
1,5d
17G
[root@localhost ~]# sed -f opt.list test.txt
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
直接操作檔案示例
#!/bin/bash
# 指定樣本檔案路徑、組態檔路徑
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"
# 備份原來的組態檔,檢測檔案名為/etc/vsftpd/vsftpd.conf.bak 備份檔案是否存在, 若不存在則使用 cp 命令進行檔案備份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak
# 基于樣本配置進行調整,覆寫現有檔案
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
# 啟動vsftpd 服務,并設為開機后自動運行
systemctl restart vsftpd
systemctl enable vsftpd
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/162442.html
標籤:Linux
下一篇:CentOS 8 網卡設定
