sed工具詳解
NAME:
sed – stream editor for filtering and transforming text(實現文本替換和過濾功能)
類型: 行編輯器(流)
特點: 把文件中的每一行加載到內存中,匹配模式,把能夠匹配到模式的內容輸出到屏幕,不修改原文件
工作模式:
每一次讀取一行文本,復制到模式空間(sed工作區間 pattern space ),先輸出到屏幕,判斷文本能否被模式匹配到,被匹配到的行執行編輯操作,編輯的結果標準輸出; 沒有被模式匹配到的行,直接標準輸出,可以被隱藏;
保持空間:被匹配的行保存到保持空間 實現與模式空間進行操作
格式:
sed [OPTION]… ’script‘ [input-file]…
一次處理多行文本
常用選項 OPTION:
-n:不輸出模式空間中的內容到屏幕
-e script,–expression=script:多點編輯; 一條命令中,可執行兩條匹配規則,-e連接 例:sed -e ‘1~2p’ -e "3d" /etc/fstad
-f PATH/TO/SED_SCRIPT_FILE 執行命令腳本 每行一個編輯命令
-r:支持使用擴展正則表達式
-i[SUFFIX]:直接編輯原文件 建議使用: i.bak sed 自動備份文件
地址定界命令:
(1)空地址:對全文進行處理
(2)單地址:
#指定行
/patten/:被此模式匹配到的每一行
(3)地址范圍
#,#:起始行到結束行
#,+#: 3,+8 從3.加8行,包含第3 行
#,/pat1/: 從第幾行到模式1匹配的行
/pat1./pat2/ 模式1到模式2之間的行
$:最后一行
(4)步進:~
1~2:所有奇數行
2~2:所有偶數
(5)& 單詞追加
追加的內容前加&,以為著前面的內容保留
追加的內容后加&,以為著后面的內容保留
編輯命令:
d:刪除 例:sed ‘1~2d’ /etc/passwd
p:打印模式空間內容 指定行會顯示兩遍 命令加上-n使用
a \text: 在被匹配到的行后面追加文本“text”,支持使用\n實現多行追加
i \text: 在被匹配到的行前面插入文本“text”,支持使用\n實現多行插入
c \text:把匹配到的行替換為此處指定的文本“text”;
w /pATH/TO/SOMEFILE:保存模式空間內的行至指定的文件中
r/PATH/FROM/SOMFILE:文件合并,讀取指定文件的內容至當前文件被模式匹配到的行后面
=:為模式匹配到的行打印行號
?。簵l件取反
模式后面,命令前面
s///:查找替換,其分隔符可自行指定,,常用@@@,###
s前面加執行范圍,%表示全部 ,可寫數字圈定范圍
替換標記
g:全局替換
w /PATH/TO/SOMMEFILE:將替換成功的行保存至指定文件中
p:顯示替換成功的行
練習:
刪除 /boot/grub/grub2.conf文件中所有以空白字符開頭的行的行首的所有空白字符
[root@wen-7 ~]# sed 's@^[[:space:]]\+@@ ' /boot/grub2/grub.cf
刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#后面的所有空白字符
[root@wen-7 ~]# sed 's@^#[[:space:]]*@@' /etc/fstab
輸出一個絕對路徑給sed,去除其目錄,其行為類似于dirname;
[root@wen-7 tmp]# echo "/etc/passwd" | sed 's@^.*\<@@' passwd
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:把保持空間中的內容覆蓋至模式空間中
G:把保持空間中的內容追加至模式空間中
x:把模式空間與保持空間中的內容互換
n:覆蓋讀取匹配到的行的下一行至模式空間中;原行被覆蓋
N:追加讀取匹配到的行的下一行至模式空間中,原文后追加
d:刪除模式空間中的行
D:刪除多行模式空間中的所有行;
實例:
sed -n ‘n;p’ FILE:顯示偶數行 (第一行匹配,第二行把第一行覆蓋輸出,(第三行匹配,第四行把第三行覆蓋輸出)
sed '1!G;h;$!d' FILE:逆序顯示文件的內容 ()
sed -n '1!G;h;$p' FILE :逆序顯示文件
sed ‘$!d’ FILE:取出文件的最后一行
sed ‘$!N;$!D’ FILE:取出文件最后兩行
sed ‘/^$/d;G' FILE :刪除原有的空白行,在所有非空白行后添加一個空白行
sed ‘n;d’ FILE :顯示奇數行
練習:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@wen-7 base]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then source $prefix/custom.cfg; fi ### END /etc/grub.d/41_custom ###
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@wen-7 base]# sed 's@^#[[:space:]]*@@g' /etc/fstab /etc/fstab Created by anaconda on Tue Jul 19 18:59:02 2016 Accessible filesystems, by reference, are maintained under '/dev/disk'
3、在/root/install.log每一行行首增加#號
A .[root@wen-7 base]# sed -n 's@^@#@gp' /root/.bash_logout ## ~/.bash_logout # B. [root@wen-7 ~]# sed 's@^@&#@' /root/install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@wen-7 base]# sed -n 's@^[^#]@&#@gp' /etc/fstab #dev/mapper/centos-root / xfs defaults 0 0 #UID=d9988fae-8ee0-434e-9caa-bd3bd20324a3 /boot xfs defaults 0 0 #dev/mapper/centos-swap swap swap defaults 0 0
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
目錄名:
A root@wen-7 base]# echo "/etc/fstab" | sed 's@[^/]\+$@@g' B [root@wen-7 ~]# echo "/etc/issue"| sed 's@[^/]\+$@@' C echo "/etc/issue"| sed -r 's@(.*/)([^/]+/)$@ /1@' D [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'
基名:
A [root@wen-7 ~]# echo "/etc/issue"|sed 's@^.*\<@@' B [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\2@ C [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'
6、利用sed 取出ifconfig命令中本機的IPv4地址
centos6.8: [root@wen-6 ~]# ifconfig|sed -n 2p |sed -r 's/.*addr:(.*) Bca.*/\1/' 172.18.19.210 centos7.2: [root@wen-7 tmp]# ifconfig|sed -n 2p |sed -r 's/.*inet(.*) netmask.*/\1/' 172.18.19.219
7、統計centos安裝光盤中Package目錄下的所有rpm文件 以.分隔倒數第二個字段的重復次數
A [root@wen-7 ~]# ls /mnt/base/*.rpm | sed -r 's@.*\.([^.]+)\.rpm$@\1@'|sort| uniq -c 1524 i686 1416 noarch 3578 x86_64 B ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c
原創文章,作者:wencx,如若轉載,請注明出處:http://www.www58058.com/32107