在編寫shell腳本的過程中,我們經常需要使用sed流編輯器和awk對文本文件進行處理。
什麼是sed?
sed是一種在線編輯器,它一次處理一行內容。sed是非交互式的編輯器。它不會修改文件,除非使用shell重定向來保存結構。默認情況下,所有的輸出行都被打印到屏幕上。
sed的處理過程是什麼?
sed編輯器逐行處理文件(或輸入),並將結果發送到屏幕。具體過程如下:首先sed先把當前正在處理的行保存在一個臨時緩存區中(也稱爲模式空間),然後處理臨時緩衝區中的行,完成後把該行發送到屏幕上。sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入。進行處理和顯示。處理完輸入文件的最後一行後,sed便結束運行。
sed命令語法
sed [option] 'AddressCommand' file....
常用的option選項參數如:
-i:修改源文件
-n:靜默模式
Address
基本可以將其理解爲對行的匹配,比如我有個100行的文件,現在有隻想對它的第二行到第五行進行刪除,這個就是Address
1、StartLine,EndLine 比如1,100
m,n:表示刪除第m行到底n行,例如'2,5d',表示刪除第2行到第5行
m,$:表示刪除第m行到最後一行,$-1位倒數第2行
2、使用模式/Pattern/ 使用正則表達式
一旦可以使用正則表達式之後,就會很靈活了
sed '/root/d' /etc/passwd #找到root匹配的行,然後進行刪除
3、/pattern1/,/pattern2/ 表示第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束
這個和之前的範圍有點類似,但是他又是正則表達式的匹配
sed '/root/,/^mysql/d' /etc/passwd ##這個有問題
4、LineNumber 表示指定的行
例如'3d',表示刪除第3行
5、StartLine,+N 表示從startline開始,向後N行,總數N+1行
sed '1,+1/d' /etc/passwd
Command
d:表示刪除符合要求的行
p:顯示符合條件的行
a \string :表示在指定的行後面追加新行,內容爲string
i \string:表示在指定的行前面追加新行,內容爲string
r filename:將指定的文件的內容添加至符合條件的行處
w filename:將指定範圍內的內容另存至指定的文件中
s /pattern/string/:查找並替換默認只替換每行中第一次被模式匹配到的字符串,修飾符g表示全局替換
s #pattern#string#:查找並替換默認只替換每行中第一次被模式匹配到的字符串,修飾符g表示全局替換
s @pattern@string@:查找並替換默認只替換每行中第一次被模式匹配到的字符串,修飾符g表示全局替換
&:引用匹配模式的整個串 例如sed 's/s..p/&r/' /etc/fstab 整個s..p的文件後面換成s..pr
\(\):後項引用sed 's/\(s..p\)/\1r/' /etc/fstab 表示s..p表示在第1項後面加1 看操作理解sed 's#s\(..p\)#S\1#' /etc/fstab
練習:
1、刪除/etc/grub.conf文件中的行首的空白符
sed '#\<^$\>#d' /etc/grub.conf
2、刪除/etc/inittab文件中"id:5:initdefault:" 一行中的數字爲3
sed 's#id\:5\:initdefault\:#id\:3\:initdefault\:#' /etc/inittab
3、刪除/etc/inittab文件中的空白行
sed '/^#/d' /etc/inittab
4、刪除/etc/inittab文件中開頭的#號
sed 's/^#//' /etc/inittab
5、刪除/etc/inittab文件中開頭的#號及後面的空白字符,要求#號後面必須有空白字符
sed 's/^#/ /' /etc/inittab