sed對比grep之理解
很多時候回車按下,沒有結果,或是報錯。 檢查發現都是低級錯誤,關鍵是習慣剛學完grep,有寫習慣沒改過來。 sed語法很重要。script語法寫對了,就成功了一大半,剩下的就是正則表達式的問題了。
sed與grep的區別是
grep是個行過濾器,篩選符合條件的行。也可以只顯示每行匹配到的文本(-o選項),不對文本進行編輯,只是顯示查找結果。 可以高亮顯示查找結果。
sed是針對行的編輯器。根據地址界定(可是使用行號,正則表達式)對指定的進行編輯,編輯操作有刪除,增加新行可多行,插入新行可多行。替換行 為單行或多行。 針對行內的內容修改只能是查找替換。針對文本行進行編輯,編輯后使用p命令輸出至標準輸出。不能夠高亮顯示查找編輯結果。sed -i 原處編輯,改變文件內容,否則只是顯示出來原文件無變化。
語法:
地址界定時使用的正則表達式的兩邊必須是/ 如 /patter/
script中的動作命令例如d和p。需要同時都要執行時,命令之間要加分號 ;
編輯命令: d: 刪除模式空間匹配到的行 p: 顯示模式空間匹配到的行 a \text:在行后面追加文本;支持使用\n實現多行追加 i\text:在行前面插入文本;支持使用\n實現多行插入 c \text:替換行為單行或多行文本 w /path/to/somefile: 保存模式匹配的行至指定文件 r /path/from/somefile:讀取指定文件的文本至模式空 間中匹配到的行后 =: 為模式空間中的行打印行號 !:模式空間中匹配進行取反處理 s///:查找替換,支持使用其它分隔符,s@@@,s### 要替換的內容使用正則表達式不使用// 替換標記: g: 行內全局替換 按行匹配,一行內多次匹配。 p: 顯示替換成功的行 w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
sed默認支持基本正則表達式,有時候寫表達式的時候經常忘記加上“\”,建議用到正則表達式的話在sed的【options】中加上-r
script語法格式:
先地址界定COMMAND;COMMAND 必須指定要界定的地址,即想好要處理那些的行,再指定要做哪些動作(干什么)。命令之間必須分號隔開;
運行原理
sed是一個非交互式的流編輯器。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出;而所謂流編輯器,是指sed每次只從文件(或輸入)讀入一行,然后對該行進行指定的處理,并將結果輸出到屏幕(除非取消了屏幕輸出又沒有顯式地使用打印命令),接著讀入下一行。整個文件像流水一樣被逐行處理然后逐行輸出。
每次讀取一個新行,執行一次script,循環執行直到最后一行。
sed顯示特性
一次處讀取一行,送到模式空間后沒有被script匹配到的行默認顯示 參數 -n 沒有匹配到的行 不顯示。 匹配到的且處理過的行 ‘script’中加入命令p 顯示匹配到且處理過的行 經過命令處理的行(包括p),默認不輸出,命令p是打印 w命令 w /path/to/somefile: 保存模式匹配的行至指定文件 查找替換的結果是默認顯示的。無需p命令
關于查找替換
是只是每行第一次被查找到的內容被替換,要想全文替換,或目標行替換,就得在script中加g命令。從行首匹配替換到行尾。
練習
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@yangyouwei ~]# sed 's@^[[:space:]]*@@' f5
abc
bsdf
ffsd
f
t
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@yangyouwei ~]# sed -n 's@^#[[:space:]]\+@@p' /etc/fstab
/etc/fstab
Created by anaconda on Wed Jul 20 16:58:24 2016
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
[root@yangyouwei ~]#
3、在/root/install.log每一行行首增加#號
[root@yangyouwei ~]# sed -rn 's@(^.*$)@#\1@p' /etc/fstab
[root@yangyouwei ~]# sed -n 's@^@#@p' /etc/fstab
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@yangyouwei ~]# sed -rn 's@^[^#]@#@p' /etc/fstab
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@yangyouwei ~]# echo /etc/fstab |sed -nr 's@[^/]+/?$@@p'
/etc/
[root@yangyouwei ~]# echo /etc/fstab |rev | sed -nr 's@/[^/]*/$@@p' |rev
fstab
6、利用sed 取出ifconfig命令中本機的IPv4地址
[root@yangyouwei ~]# ifconfig | sed -nr '/Bcast/p' | sed -nr 's@[[:alpha:]:]*@@g;p' | sed -nr 's@^[[:space:]]+@@p' | sed -nr 's@[[:space:]]+.*$@@p'
192.168.226.128
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
[root@yangyouwei ~]# ls /media/cdrom/Packages/ | sed -nr 's@.[^.]*$@@p' | rev | cut -d. -f1 |sort | uniq -c
2283 46_68x
4 686i
919 hcraon
1 SNART
原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/32556