sed:stream editor,行編輯器
sed命令工作原理:它在處理數據時,每次只處理一行,首先把當前處理的行存儲在臨時緩沖區中,我們稱這個緩沖區稱為“”模式空間“,接著用sed命令處理緩沖區中的內容,處理完后,把緩沖區中的內容送到屏幕上顯示出來,接著去處理下一行,重復執行,直到至末行,這里需要注意的是我們沒有編輯原文件,原文件不會改變,當然我們也可以通過相關命令來編輯原文件。
sed的主要功能:查找匹配到的文本打印出來,替換匹配到的文本,編輯文本等
前面我們提到的grep也是針對行的操作的,也可以查找匹配到需要的內容,那么他們有什么區呢?grep:文本搜索工具,根據用戶指定的模式來對文本逐行匹配檢查,打印到匹配到的行,只能搜索不能編輯,-v和-o的功能與sed中的替換功能類似。
在使用sed處理行時需要注意:如果說要去掉行中的某一部分內容或者是某刪除某部分內容,我們只能使用替換方法處理,因為sed時針對行編輯的,d選項操作會刪除整行。
sed選項:
-n:不輸出模式空間中的內容;默認情況下默認打印所有文本,也會打印我們匹配到的內容
root@cenots6.8 ~ # sed '1p' /etc/issue CentOS release 6.8 (Final) CentOS release 6.8 (Final) Kernel \r on an \
root@cenots6.8 ~ # sed -n '1p' /etc/issue CentOS release 6.8 (Final)
-r:支持擴展正則表達式
-e:支持多點編輯
root@cenots6.8 ~ # sed -n -e '1p' -e '1p' /etc/issue CentOS release 6.8 (Final) CentOS release 6.8 (Final)
a\:在匹配到的行的下一行添加內容
root@cenots6.8 ~ # sed '1a\I am here' /etc/issue CentOS release 6.8 (Final) I am here Kernel \r on an \m
i\:在匹配到的行的上一行添加內容
root@cenots6.8 ~ # sed '1i\I am here' /etc/issue I am here CentOS release 6.8 (Final) Kernel \r on an \
c\:把匹配到的行替換為你需要的內容
root@cenots6.8 ~ # sed '1c\I am here' /etc/issue I am here Kernel \r on an \m
w:把匹配到的內容覆蓋到指定的文件中。。。。注意 覆蓋 覆蓋 覆蓋。。。。。
root@cenots6.8 ~ # sed '1w /testdir/FA' /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m root@cenots6.8 ~ # cat /testdir/FA CentOS release 6.8 (Final)
r:把文件中的內容輸入到匹配到的行的下一行
root@cenots6.8 ~ # sed '1r /testdir/FA' /etc/issue CentOS release 6.8 (Final) aaaaaaaaaaaaaaaaaaaaaa Kernel \r on an \
=:在匹配到的行顯示行號
root@cenots6.8 ~ # sed '2=' /etc/issue CentOS release 6.8 (Final) 2 Kernel \r on an \
?。耗J娇臻g中匹配行取反處理
root@cenots6.8 ~ # cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m root@cenots6.8 ~ # sed '1!d' /etc/issue CentOS release 6.8 (Final) root@cenots6.8 ~ # sed '1d' /etc/issue Kernel \r on an \m
&:匹配到的字符
root@Centos7.2 ~ # sed -n 's@root@&superman@p' /etc/passwd ----&superman 在匹配到的單詞后加superman rootsuperman:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/rootsuperman:/sbin/nologin root@Centos7.2 ~ # sed -n 's@root@superman&@p' /etc/passwd ----&superman 在匹配到的單詞前加superman supermanroot:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/supermanroot:/sbin/nologin
s///:查找替換,支持使用正則表達,也可以將///替換為@@@
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
sed高級用法:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
應用示例
sed -n 'n;p' FILE #顯示偶數行 sed '1!G;h;$!d' FILE #倒序顯示 sed '$!N;$!D' FILE #顯示最后兩行 sed '$!d' FILE #只顯示最后一行 sed ‘G’ FILE #每一行的后面加一個空行 sed ‘g’ FILE #將每行用空行替換 sed ‘/^$/d;G’ FILE #刪除所有空行后,在行后追加空行 sed 'n;d' FILE #顯示基數行 sed -n '1!G;h;$p' FILE #倒序排序
練習:
1、替換/etc/inittab文件中“id:3:initdefault:”一行中的數字為5
sed 's@\(id:\)[0-9]\(:initdefault:\)@\110000\2@' /etc/inittab
2、刪除/etc/init.d/functions 文件中的空白行
sed "/^$/d" /etc/init.d/functions
3、刪除/etc/inittab 文件中的空白行
sed "s@^#@@g" /etc/inittab
4、刪除/etc/rc .d/rc.sysinit文件中以#后面跟至少一個空白符開頭的行的行首的#和空白字符
sed "s@^#[[:space:]]\+@@g" /etc/rc.d/rc.sysinit
5、刪除/boot/grub/grub.conf文件中行首空白字符
sed "s@^[[:space:]]\+@@g" /boot/grub/grub.conf
6、取出一個文件路徑的目錄名稱,如/etc/sysconfig/network,
echo "/etc/sysconfig/network" |sed "s@/.*/@@g" --basename echo "/etc/sysconfig/network" | sed 's@[^/]\+/\?$@@g' --dirname echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\2@'
7、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
sed -e "s@^[[:space:]]\+@@g" -e "/^$/d" /etc/grub2.cfg
8、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
sed 's@^#[[:space:]]\+@@g' /etc/fstab
9、在/root/install.log每一行行首增加#號
sed -r 's@(^.*$)@#\1@g' /root/install.log sed "s@\(.*\)@#\1@g" /root/install.log
10、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed -r 's@(^[^#].*)@#\1@g' /etc/fstab sed "s@\(^[^#].*\)@#\1@g" /etc/fstab
11、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
echo "/etc/fstab/" | sed -r 's@(.*/)([^/]+/?)$@\2@' echo "/etc/fstab/" | sed 's@[^/]\{1,\}/\?$@@
12、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig|sed -n 2p |sed -r 's/.*addr:(.*) Bca.*/\1/' ifconfig|sed -n 2p |sed -e 's/.*addr://' -e 's/ B.*//'
13、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
cd /run/media/naruto/CentOS\ 7\ x86_64/Packages/ ls *.rpm |sed -r 's#.*\.(.*)\.rpm$#\1#'|sort |uniq -c ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c
14、正則表達式表示身份證號
egrep "\<((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|(71|81|82))([0-9]){4}(19|20)([0-9]){2}((0[1-9])|(1[0-2]))(0[1-9]|([0-9])|(2[0-9])|(3[0-1]))([0-9]){3}([0-9]|X)\>" filename
15、正則表達式表示手機號
grep -E -o "(\+86)?1[38][0-9]{9}|14[57][0-9]{8}|15[0-35-9][0-9]{8}|17[0678][0-9]{8}" haoma
16、正則表達式表示郵箱
egrep "\<([[:alnum:]]+(-|_)*[[:alnum:]]*)\>@([[:alnum:]]+\.)+[[:alnum:]]+" mail grep -E -o '[a-zA-Z0-9]+[[:alnum:]\.\_-]*@[a-zA-Z0-9]+[[:alnum:]\.\_-]*' haoma
17、正則表達式表示QQ號
grep -E -o '\b[1-9][0-9]{4,12}\b' haoma
原創文章,作者:Naruto,如若轉載,請注明出處:http://www.www58058.com/32235