sed工作原理:sed從文件中讀取出來一行,并不會直接進行編輯處理而是會放在自己的模式空間內進行處理,處理的結果將會送到標準輸出,默認情況下sed可以對每行文本進行處理,也可以讓sed處理符合條件的行,我們可以利用正則表達式做文本過濾,模式空間有兩種輸出結果,一種是可以匹配到的,會根據編輯要求進行處理,例如刪除,過濾字符串。另外一種則是匹配失敗的,會直接進行標準輸出。
sed常用選項:
-n:不輸出模式空間中的內容至屏幕;不會把模式空間內的信息輸出出來。
-e:多點編輯;可以同時編輯多個匹配條件
-f:/PATH/SED_SCRIPT_FILE 每行一個編輯命令;讀取文件內的篩選條件
-R:支持使用擴展表達式;使用苦戰表達式
-i: 直接編輯源文件;操作比較危險,會直接更改原文件。
地址定界:
(1)空地址:對全文進行處理;
(2)單地址:
#:指定行;
[root@nzg7 ~]# sed -n '2p' /etc/passwd
/pattern/;被此模式匹配到的每一行;
[root@nzg7 ~]# sed -n '/^root/p' /etc/passwd
(3)地址范圍:
#,#:
[root@nzg7 ~]# sed -n '1,2p' /etc/passwd
#,+#:向后+#行
[root@nzg7 ~]# sed -n '1,+2p' /etc/passwd
#,/pat1/:
[root@nzg7 ~]# sed -n '1,/^nologin/p' /etc/passwd
/pat1/,/pat2/
[root@nzg7 ~]# sed -n '/^root/,/^nologin/p' /etc/passwd
(4)步進:~
1~2:所有奇數行
[root@nzg7 nzg]# sed -n '1~2p' f1
2~2:所有偶數行
[root@nzg7 nzg]# sed -n '2~2p' f1
編輯命令:
d:刪除;
[root@nzg7 nzg]# sed '2~2d' f1 刪除偶數行
p: 顯示模式空間中的內容;
[root@nzg7 nzg]# sed -n '2~2p' f1 顯示匹配結果
a \text:在行后面追加文本"text",支持使用\n實現多行追加;
[root@nzg7 nzg]# sed '100a \luyubo' f1
[root@nzg7 nzg]# sed '100a \luyubo\nnaozhongge' f1
i \text;在行前面插入文本"text",支持使用\n實現多行插入; 加.可以實現備份
[root@nzg7 nzg]# sed '100i \luyubo' f1
[root@nzg7 nzg]# sed '100i \luyubo\nnaozhongge' f1
c \text:把匹配等到的行替換為此處指定的文本“text”;
[root@nzg7 nzg]# sed '100c \luyubo' f1
[root@nzg7 nzg]# sed '100c \luyubo\nnaozhongge' f1
W /PTAH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
[root@nzg7 nzg]# sed -n '/^[^#]/w /home/nzgqq' /etc/fstab
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行后面;
[root@nzg7 nzg]# sed -n '/^[^#]/r /home/nzgqq' /etc/fstab
= 為模式匹配到的行打印行號;
[root@nzg7 nzg]# sed '/^[^#]/=' /etc/fstab
!條件取反;
地址定界!編輯命令;
[root@nzg7 nzg]# sed -n '/^[^#]/!p' /etc/fstab
s///:查找替換,其分隔符可自行指定,常用的有s@@@,s###等;
例如:刪除/etc/grub2.conf文件中所有以空白開頭的行行首的 空白字符
[root@nzg7 nzg]# sed -n 's@^[[:space:]]\+@@p' /etc/grub2.cfg
替換標記:
g:全局替換;
[root@nzg7 nzg]# sed -n 's@[[:digit:]]@q@pg' f1
w:/PATH/TO/SOMEFILE; 將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
[root@nzg7 nzg]# sed -n 's@[[:digit:]]@q@pgw /home/f22' f1
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n: 覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;
高級編輯命令示例:
sed -n 'n;p' FILE 顯示偶數
sed '1!G;h;$!d' FILE 倒序顯示
sed '$!N;$!D' FILE 顯示最后兩行
sed '$!d' FILE 顯示最后1行
sed 'G' FILE 每行后面插入空格
sed 'g' FILE 全部替換空格
sed '/^$/d;G' FILE 每行后面插入空格
sed 'n;d' FILE 顯示奇數
sed -n '1!G;h;$p' FILE 倒序顯示
練習題案例:
1.刪除/etc/grub2.conf文件中所有以空白開頭的行行首的 空白字符
[root@nzg7 nzg]# sed 's@^[[:space:]]\+@@p' /etc/grub2.cfg
2.刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@nzg7 nzg]# sed 's@^#[[:space:]]\+@@p' /etc/fstab
3.在/root/install.log每一行行首增加#號
[root@nzg7 ~]# sed 's@^@#@' install.log
4.、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@nzg7 ~]# sed -r 's@.*@#&@' install.log
[root@nzg7 ~]# sed 's@^@#@' install.log
5.處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@nzg7 ~]# echo "/etc/fstab" | sed -r 's@^(/.*/)([^/]+/?)@\1@'
[root@nzg7 ~]# echo "/etc/fstab" | sed -r 's@^(/.*/)([^/]+/?)@\2@'
6.利用sed 取出ifconfig命令中本機的IPv4地址
[root@nzg7 ~]# ifconfig | sed -n '/\<inet\>/p' | sed -r 's@inet (([0-9]+\.){3}[0-9]+).*@\1@'
[root@nzg7 ~]# ifconfig | sed -n '/\<inet\>/p' |sed -r 's@inet @@'| sed -r 's@netmask.*@@'
7.統計centos安裝光盤中Package目錄下的所有rpm文件的 以.分隔倒數第二個字段的重復次數
[root@localhost Packages]# ll *.rpm |sed -r 's@.*\.([^.]+)\.rpm$@\1@' |sort |uniq -c
原創文章,作者:鬧鐘哥,如若轉載,請注明出處:http://www.www58058.com/32459