這周我們學習了文本處理工具三劍客之一的sed,對于之前學的grep同樣的重要,也同樣是一個難點。sed是針對一個文件或者多個文件一行一行處理的,它處理的時候,把當前處理的行存儲在模式空間,處理完成后,把緩沖區內容輸出到屏幕上,接著處理下一行。直到文件末尾。原文件并沒有經過更改。
1、sed一些常用的選項
-n 不輸出模式空間的內容到屏幕上,相當于靜默模式
-e 多點編輯模式,可以對一行內容進行多點處理
-f 把script寫到文件當中,在執行sed時-f指定文件路徑,如果是多個script,換行寫
-r 支持使用擴展的正則表達式
-i.bak 編寫的文件寫入文件之前備份原文件(-i是直接對原文件進行修改)
2、sed 中的script,地址定界
不給地址:對全文處理
單地址:#指定的行
/pattern/ 被此處模式所能夠匹配到的每一行
地址范圍:#,#
#,+#
/pat1/,/pat2/
#,/pat1/
跳行: sed -n ‘1~2p’ 只打印奇數行
sed -n ‘2~2p’ 只打印偶數行
sed -n ‘1~3p’ 從第1行開始,每隔3行顯示一次
3、sed編輯命令
d:刪除模式空間匹配的行,并立即啟用下一輪循環
p: 打印當前模式空間內容,追加到默認輸出之后
a\text:在指定行后面追加文本,支持使用\n實現多行追加
i\text:在行前面插入文本
c\text:替換行為單位或多行文本
w 新文件路徑:保存模式匹配的行至指定文件
r 文件路徑:讀取指定文件的文本至模式空間中匹配到的行后
=:為模式空間中的行打印行號
!:模式空間中匹配行取反處理
s///:查找替換,支持使用其它分隔符,s@@@ s###
g:行內全局替換
4、sed高級編輯命令
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不再傳至標準輸 出),放棄之后的命令,但是對剩余模式空間重新執行sed
5、練習
(1)刪除centos7系統/etc/grub2.cfg文件中所有以空白開頭 的行行首的空白字符
紅色標記為:將以空白字符開頭并且重復一次以上的內容刪除
(2)刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空 白字符的行的行首的#和空白字符
紅色標記為:以#開頭后面跟空白字符并且重復一次以上的內容刪除
(3)在centos6系統/root/install.log每一行行首增加#號
內容太長所以我就只截取了前十行
紅色標記為:開頭的內容替換為#號
(4)在/etc/fstab文件中不以#開頭的行的行首增加#號
紅色標記為:以非#號開頭的前面加一個#號,如果不加&則不是#開頭的第一個字母也會被覆蓋
(5)處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
第一個括號里面代表的是目錄名,第二個括號里面是基名,這里引用一個后向引用
(6)利用sed 取出ifconfig命令中本機的IPv4地址
紅色標記的為:取出eth0里面的第二行
藍色標記的為:以addr:之前的內容刪除
黃色標記的為:以 Bcast后面的內容全部刪除
(7)統計centos安裝光盤中Package目錄下的所有rpm文件的 以.分隔倒數第二個字段的重復次數
黃色標記的為:因為Packages里面有一行TRANS.TBL所以我們要把這行刪除
紅色標記的為:里面的小括號是兩個.中間的內容
里面的大括號是全部內容。
這里我們引用一個后向引用,只要.rpm前面的內容不包括.的
(8)統計/etc/init.d/functions文件中每個單詞的出現次數, 并排序(用grep和sed兩種方法分別實現)
用grep:
紅色標記的為:只截取以大小寫字母重復至少一次的內容,錨定了一下,中間就不會有別的任何字符
用sed:
紅色標記的為:任何非英文的重復一次以上的換行
黃色標記的為:刪除空行
(9)將文本文件的n和n+1行合并為一行,n為奇數行
紅色標記的為:讀第一行的時候直接把第二行也追加到模式空間里面的第一行下面,然后在模式空間里面把第一行和第二行的換行符刪掉,完成后輸出出來。接下來讀取第三行的時候同第一行一樣,直接把第四行追加到模式空間第三行的下面
還有一種方法如下:
cat -n /etc/passwd |sed -n ‘1~2p’ > /app/file1 將/etc/passwd里面的奇數行取出來放到file1文件中
cat -n /etc/passwd |sed -n ‘2~2p’ > /app/file2 將/etc/passwd里面的偶數行取出來放到file2文件中
paste -d “” file1 file2 把file1 file2文件合并為一個文件顯示出來
原創文章,作者:In summer,如若轉載,請注明出處:http://www.www58058.com/85403