iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1
Software Development

系統與服務雜談系列 第 9

sed - 簡介 讀取編輯文字檔的好工具

sed

sed (Stream Editor), 相較於之前的grep、awk都比較篇查找排版工具, sed則是輸出與修改工具.
跟awk一樣也是以為逐筆進行的方式.

也是能分析日誌與文件, 但更多都是修改配置文件用.
針對文件的行做替換; 或者對字串做替換取得.
但sed本身改變的不是原來的文件內容, 而是pattern space內的, 除非重新定向至原檔案做輸出.

sed 工作流程

跟awk很像, 只是sed先把資料讀取進pattern space一個緩衝區空間.
其實還有另一個hold space後面再補充.
pattern space並不會主動被清空,
而是要透過sed的d (delete pattern space)-n這option或是是輸出到stdout上時.
每一行讀取出來要放到pattern space時, 都會把末端的\n給去掉, 再放到pattern space內.
https://ithelp.ithome.com.tw/upload/images/20210914/20104930a8Akeh0904.png

sed 格式

# 命令行格式
sed [option] "pattern command" file(s)
# 腳本格式
sed [option] -f scriptName file(s)
#  管道格式
stdout | sed [option] "pattern command"

格式其實跟awk、grep雷同, 要就讀取檔案, 不然就是從管線讀取

簡單案例

pattern這裡大部分也都還是/Regex/, 後面接著p(print) command
先展示沒有pattern只有command的時候

sed 'p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930K9pNBz7t4H.png
sed預設是會把讀取到的每行文字跟匹配到的行內容, 都做輸出;
因為沒有pattern做匹配, 等於就全部都匹配到了.

因為sed預設是會把patern space的每一行也輸出,
搭配-n(slient), 就不會把pattern space的內容做輸出.
但後面的command是p所以只要pattern匹配到的行內容還是會做輸出.

sed -n 'p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930MK8VPAP9Qw.png

新增針對Python字串做匹配

sed -n '/Python/p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930NMaQs1aq3z.png

如果pattern command寫得很長, 也能把pattern command寫在檔案內, 透過-f來執行調用

# 準備sed命令檔案
cat > edit.sed <<EOF         
/Python/p
EOF

sed -n -f edit.sed python.txt

得到跟上圖一樣的結果

sed預設只會針對1組pattern command做操作
如果需要針對多組pattern command做操作, 需要搭配-e(add script to be excuted)
在每組pattern command前加上-e

sed -n -e '/cat/p' -e '/bat/p' python.txt
>cat
>bat

上組操作, 好像能搭配Regex的or來匹配多組字串

sed -n '/cat|bat/p' python.txt

按下去, 啥都沒有顯示???
sed其實跟grep很像, 默認不吃Regex的一些符號, 此時需要搭配-r

sed -n -r '/cat|bat/p' python.txt
>cat
>bat

sed最重要的編輯功能呢? 別急!
這裡pattern前面有個s, 就是搜尋並取代的意思, 搜尋/目標對象/取代對象/
多個command中間要用;隔開

sed -n 's/Python/Go/g;p' python.txt

https://i.imgur.com/AxGWef3.png

但會發現python.txt還是原來的內容阿??? 黑人問號!
回到一開始sed的特性, sed預設不修改原來檔案, 只是在pattern space內做操作並輸出

如果想修改需要搭配-i(edit file in place)

sed -i 's/Python/Go/g' python.txt 

https://ithelp.ithome.com.tw/upload/images/20210915/201049302gTX6Zycs2.png

試想看看, 要是有一組設定檔, 需要同時對${client_host}這樣的設定, 在不同環境做修改時,
sed是很方便的工具, 且基本上Linux發行版本上預設都有安裝.
或者使用envsubst會更為方便


上一篇
awk - 4 常見處理案例
下一篇
sed - 2 Pattern
系列文
系統與服務雜談32

尚未有邦友留言

立即登入留言