1.文本處理三劍客-sed
#sed語法: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed理解:是一種流編輯器,一次處理一行內容,處理時把當前處理的行存儲在臨時緩存中,成為“模式空間”,接著用sed命令處理緩沖區的內容,處理完畢后吧緩沖區內容輸出到屏幕接著處理下一行。這樣不斷重復到末尾。文件內容并沒有改變。除非使用重定向輸出才會改變內容。
常用選項
-n 不輸出模式空間到屏幕 -e 多點編輯,或 -f 從指定文件中讀取編輯腳本 -r 使用擴展表達式 -i 原處編輯
2.sed處理地址范圍定界:
1. 不給地址表示對全文處理
2. 單地址 指定行 ‘1‘ 第一行 ;
/ 關鍵字,可以是正則表達式或其他模糊匹配的符號/
3. 地址范圍
'2,10'第二行到第十行
’2,+10‘第二行再加10行
/關鍵字/,/關鍵字/匹配第一個關鍵字到第二個關鍵字之間的內容 ;
4. 步進
’1~2‘奇數行
’2~2’偶數行
3.sed編輯命令
d 刪除模式空間匹配到的行
[root@localhost testdir]# sed '1d' 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jul 28 17:47:00 2016
p 顯示模式空間中的內容
[root@localhost ~]# sed '2p' /etc/issue \S Kernel \r on an \m Kernel \r on an \m
顯示兩次的原因因為在模式空間輸出一次然后p顯示一次,加上-n是表示不輸出模式空間到屏幕,如下輸出
[root@localhost ~]# sed '2p' /etc/issue \S Kernel \r on an \m
a \添加內容 在匹配行后加入文本 \n多行插入
#實例解釋 [root@localhost testdir]# sed -e /UUID/a\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e /UUID/i\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ file1 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jul 28 17:47:00 2016 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 /dev/mapper/centos-root / xfs defaults 0 0 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 10 UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot xfs defaults 0 0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
i \添加內容 在匹配行后加入文本 \n多行插入
#實例解釋 [root@localhost testdir]# sed '/^U/i\ZZZZZZZZZZZZZZZZZZZZZ\nNNNNNNNNNNNNNNNNNNNNNN\nssssssssssssssss' file3 #輸出結果 ZZZZZZZZZZZZZZZZZZZZZ NNNNNNNNNNNNNNNNNNNNNN ssssssssssssssss UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot
c \替換內容 替換單行或多行文本
#實例解釋,也支持\n換行 [root@localhost testdir]# sed '/^U/c\relace' file3 #將以U打頭的行替換成‘relace’
w /保存新文件路徑
[root@localhost testdir]# sed '/^U/w /testdir/5' file3
r /保存文件路徑
[root@localhost testdir]# sed '/^U/r /etc/issue' file3
= 在模式空間中打印行號
[root@localhost testdir]# sed '/^U/=' file6
!模式空間匹配到的取反
[root@localhost testdir]# sed '/^U/!=' file6
#ps:sed文件出是不修改原文件內容的,如果要修改可以使用選項-i
[root@localhost testdir]# sed -i '/^U/d' 3
修改之前可以將文件進行備份,在-i選項后面添加備份名可以在修改之前備份該文件
[root@localhost testdir]# sed -i.bak '/^U/d' 3
4.sed搜索替換
s/// 查找替換 支持使用分割符包括s@@@,s### 替換標記; g:全局替換 p:顯示替換成功的行 w 將替換成功的行保存至新文件
#實例操作解釋 #1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符 [root@localhost testdir]# sed '/^[[:space:]]\+/d' /etc/grub2.cfg #2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符 [root@localhost testdir]# sed 's/^#[[:space:]]\+//' /etc/fstab #3、在/root/install.log每一行行首增加#號 [root@centos6 ~]# sed -n 's/^/#/p' /root/install.log #4、在/etc/fstab文件中不以#開頭的行的行首增加#號 [root@centos6 ~]# sed 's/^[^#]/#/' /etc/fstab #5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名 取基名 echo "/etc/fst/sd" | sed -r 's@(.*)/([^/]+/?)@\2@' echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\1@' echo "/etc/fst/sd/" | sed 's@.*\<@@' 取目錄 echo "/etc/fst/sd/" | sed -r 's#[^/]+/?$##' #6、利用sed 取出ifconfig命令中本機的IPv4地址 [root@centos6 ~]# ifconfig|sed -n '2p'|sed 's/\<B.*//'|sed 's/^.*r:'// #7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數 [root@centos6 Packages]# ls |sed 's/.rpm$'//|sed 's/.*\.'//|sort|uniq -c
5.sed高級應用
首先要了解使用sed兩個緩存空間,一個是模式空間,在前面已經說過了
另一個是保持空間
下面幾個是sed的高級應用
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
#實例解釋以后補充
原創文章,作者:snowbamboo,如若轉載,請注明出處:http://www.www58058.com/33576