sed 命令詳解
sed 正則表達(dá)式特點(diǎn)
1)sed 文本工具支持:BREs、EREs
sed 指令默認(rèn)是使用"BREs"
sed 命令參數(shù) “-r ” ,則表示要使用“EREs"
2)sed 功能與作用
a. sed 處理的對(duì)象:文本文件
b. sed 處理操作:對(duì)文本文件的內(nèi)容進(jìn)行 --- 查找、替換、刪除、增加等操作
c. sed 在處理文本文件的時(shí)候,也是按行處理的
sed 格式:sed 選項(xiàng) '位置命令(哪些位置做什么操作)' 讀入的文件
常用選項(xiàng):
-n 不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印
-e 多點(diǎn)編輯
-r 支持使用擴(kuò)展正則表達(dá)式
-i.bak 備份文件并原處編輯
-i 不備份文件并修改
位置定界:
(1) 不給地址:對(duì)全文進(jìn)行處理
(2) 單地址:
#:指定的行,$:最后一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
編輯命令:
d 刪除模式空間匹配的行,并立即啟用下一輪循環(huán)
p 打印當(dāng)前模式空間內(nèi)容,追加到默認(rèn)輸出之后
a [\]text 在指定行的下一行追加文本,支持使用\n實(shí)現(xiàn)多行追加
i [\]text 在指定行的上一行插入文本
c [\]text 替換行為單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行后
= 為模式空間中的行打印行號(hào)
! 模式空間中匹配行取反處理
sed工具還有一個(gè)專門用于搜索替換的 (可以不用位置直接使用,也可以在指定位置后面,當(dāng)做命令使用)
格式:s/// 查找替換,支持使用其它分隔符,s@@@,s###
替換標(biāo)記:
g 行內(nèi)全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文件中
sed 工作原理,每次讀取文本中的一行,也是逐行處理,將讀取的一行放到“模式空間”,進(jìn)行處理,比如查看,打印,修改等,然后就在“模式空間”把這一行刪掉,然后再加載下面一行。在模式空間中,默認(rèn)的不需要做什么操作,就會(huì)自動(dòng)把這一行打印出來(lái)。相當(dāng)于模式空間中內(nèi)置了 print操作。
sed 格式:sed 選項(xiàng) '位置命令(哪些位置做什么操作)' 讀入的文件
sed '' /etc/passwd //沒(méi)有選項(xiàng),沒(méi)有位置,默認(rèn)就是全文,沒(méi)有操作,默認(rèn)就是打印的操作。所以就會(huì)把/etc/passwd 文件內(nèi)容全部打印出來(lái)
sed 支持管道的,也就是可以把命令的執(zhí)行結(jié)果傳給sed。 ifconfig eth0 | sed -n '2p' //位置2,操作是p。打印第二行
位置格式除了,固定的位置,也可以使用正則表達(dá)式來(lái)匹配相應(yīng)的位置 sed -n '/^U/p' /etc/fstab // 以U開(kāi)頭的行,打印
位置也可以使用一個(gè)地址范圍,比如 從第幾行到第幾行,從第幾行往后幾行,從一個(gè)模式到另一個(gè)模式中間的幾行,從第幾行到符合模式的行的中間
seq 10 | sed -n '3,5p' ///打印第三行到第五行的內(nèi)容。
例子:
sed -n '/^b/,/^f/p' //-n 關(guān)閉自動(dòng)打印,顯示b開(kāi)頭 與f開(kāi)頭之間的行 面試題,找出幾點(diǎn)幾分到幾點(diǎn)幾分的日志信息
sed '/^#/d' /etc/fstab //位置是以#號(hào)開(kāi)頭的行,操作是d刪除。 以#開(kāi)頭的行 不顯示 ,這些只是顯示結(jié)果,不會(huì)改變文件的內(nèi)容
sed '/^#/d' /etc/fstab |sed '/^$/d' //不顯示#號(hào)開(kāi)頭的行,并且不顯示空行
sed '/^#/d;/^$/d' /etc/fstab //使用兩個(gè)正則表達(dá)式條件,不顯示#號(hào)開(kāi)頭的行,并且不顯示空行
seq 10 | sed -n '1~2p' //步進(jìn) 1~2 奇數(shù)行 2~2 偶數(shù)行
sed -n '2p' sed -n '$p'
sed 10|sed '1~2a line' //位置是1~2,操作是a line 表示在匹配的行的下一行追加line
sed -i.bak '/^root/a line firename' //在 root開(kāi)頭的行的下一行追加一行firename -i 會(huì)把修改的內(nèi)容寫(xiě)到文件里。 -i.bak 是先把文件備份成.bak后綴,然后再修改源文件
sed -i.bak '/^Listen/a listen 8080' /etc/httpd/conf/httpd.conf //先把httpd.conf 備份成.bak文件,然后再源文件的Listen開(kāi)頭的行,下一行添加listen 8080
sed -i.bak '/^Listen/i listen 8080' /etc/httpd/conf/httpd.conf //操作i 是在匹配行的上一行添加
sed -i.bak '/^Listen/i\ listen 8080' /etc/httpd/conf/httpd.conf //添加的前面有空格
sed -i.bak '/^Listen/c listen 8080' /etc/httpd/conf/httpd.conf //操作c 是替換
sed '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config /// 位置是‘SELINUX=’開(kāi)頭的行,操作是c 替換成SELINUX=disabled 搜索出的這一行 替換掉
sed '/^#/d;w /data/httpd.conf' /etc/httpd/conf/httpd.conf ///位置是#開(kāi)頭的行,操作是d;w 先刪掉,然后再另存為/data/httpd.conf 把#號(hào)開(kāi)頭的行刪掉,然后另存為
sed 's/root/ROOT/g' passwd //搜索替換,把root替換成ROOT,不加g的話默認(rèn)只替換第一個(gè),g是全部的意思,搜索出來(lái)的全部替換成
sed -i.bak 's/^[0-9]\+$/this is tihuan!!/g' cattest.txt ///使用搜索替換和操作c效果一樣
sed -i.bak '/^[0-9]\+$/c this is tihuan!!' cattest.txt ///使用搜索替換和操作c效果一樣
sed -i.bak '/^root/,/^<root/s/#//g' list.txt //////找到 root與<root 之間的位置 做全局的搜索替代g,把#都刪掉了,然后保存到了源文件中
sed -n '/#<VirtualHost/,/#<\/VirtualHost/s@#@@p' /etc/httpd/conf/httpd.conf //找到這個(gè)節(jié)點(diǎn),做搜索替換,把#刪掉
[root@centos7 data]#ifconfig eth0|sed -n '2s/^.*inet //;s@ netmask.*$@@p' ///對(duì)于第二行 做搜索替代,然后p打印
[root@centos6 data]#ifconfig eth0 | sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*$)/\2/p' ///分組替代
[root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@\1@' ///分組替代
/etc/sysconfig/
[root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@\2@' ///分組替代
network-scripts
sed -rn '/^[[:space:]+linux16]/s#(.*)#\1 我想假加的字符串 #p' /boot/grub2/grub.cfg //找到linux16的行,在行的最后面加上你想要的東西
sed -rn '/^[[:space:]+linux16]/s#(.*)#\1 net.ifnames=0 #p' /boot/grub2/grub.cfg //這個(gè)命令會(huì)把網(wǎng)卡名字改為傳統(tǒng)的網(wǎng)卡 eth1.。。。[root@centos7 data]#sed 's/'''$var'''/wang/' passwd ///使用變量 '''
sed -rn '/rhgb quiet/s#(.*)(rhgb quiet)("$)#\1\2 int int \3#p' /etc/default/grub[root@centos7 Packages]#ls *.rpm|sed -r 's/.*\.(.*)\.rpm$/\1/'|sort|uniq -c //查看rpm前面的架構(gòu)都有哪幾種 分別的個(gè)數(shù)
2258 i686
3122 noarch
4639 x86_64
[root@centos7 Packages]#ls *.rpm|rev|cut -d. -f2|rev|sort |uniq -c
2258 i686
3122 noarch
4639 x86_64

浙公網(wǎng)安備 33010602011771號(hào)