sed 行編輯器
目錄
語法及常用選項
地址定界
編輯命令
查找替換
sed元字符集
高級編輯命令
示例拓展
語法及常用選項
地址定界:
使用行號,可以是一個簡單數字,或是一個行號範圍
選項 | 功能 |
---|---|
(1) 不給地址: | 對全文進行處理 |
(2) 單地址: | |
#: | 指定的行 |
(3) 地址範圍: | |
#,# | 從幾行到幾行 |
#,+# | 一某行位基礎在家#行 |
/pat1/,/pat2/ | 從pat1開始到pat2結束,多段匹配, |
#,/pat1/ | 從#行開始到pat1結束, |
(4) ~:步進 | |
1~2 奇數行 | sed '1~2p' |
2~2 偶數行 | sed '2~2p' |
編輯命令:
主要用來自動編輯一個或多個文件,簡化對文件的反覆 操作,編寫轉換程序等
選項 | 功能 |
---|---|
d: | 刪除模式空間匹配的行,並立即啓用下一輪循環 |
p: | 打印當前模式空間內容,追加到默認輸出之後 |
a: | []text:在指定行後面追加文本 支持使用\n實現多行追加 |
i: | []text:在行前面插入文本 |
c: | []text:替換行爲單行或多行文本 |
w: | /path/somefile: 保存模式匹配的行至指定文件 |
r: | /path/somefile:讀取指定文件的文本至模式空間中 匹配到的行後 |
l: | 列表不能打印字符的清單 |
=: | 爲模式空間中的行打印行號 |
!: | 模式空間中匹配行取反處理 |
sed元字符集
使用正則表達式、擴展正則表達式(必須結合-r選項)
選項 | 功能 |
---|---|
^ | 匹配行開始,如:/^sed/匹配所有以sed開頭的行。 |
$ | 匹配行結束,如:/sed$/匹配所有以sed結尾的行。 |
. | 匹配一個非換行符的任意字符,如:/s.d/匹配s後接一個任意字符,最後是d。 |
* | 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。 |
[] | 匹配一個指定範圍內的字符,如/[ss]ed/匹配sed和Sed。 |
[^] | 匹配一個不在指定範圍內的字符,如:/[^AB]ed/匹配A/B字母開頭,緊跟ed的行。 |
(..) | 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替換成lovers。 |
& | 保存搜索字符用來替換其他字符,如s/love/&/,love這成love。 |
\< | 匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。 |
\> | 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。 |
x{m} | 重複字符x,m次,如:/0{5}/匹配包含5個0的行。 |
x{m,} | 重複字符x,至少m次,如:/0{5,}/匹配至少有5個0的行。 |
x{m,n} | 重複字符x,至少m次,不多於n次,如:/0{5,10}/匹配5~10個0的行。 |
[:digit:] | 所有數字, 相當於0-9, [0-9]---> [[:digit:]] |
[:lower:] | 所有的小寫字母 |
[:upper:] | 所有的大寫字母 |
[:alpha:] | 所有的字母 |
[:alnum:] | 相當於0-9a-zA-Z |
[:space:] | 空白字符 |
[:punct:] | 所有標點符號 |
查找替換
高級編輯命令
選項 | 功能 |
---|---|
P: | 打印模式空間開端至\n內容,並追加到默認輸出之前 |
P: | (大寫) 打印模板塊的第一行 |
q: | 退出Sed |
h: | 把模式空間中的內容覆蓋至保持空間中 |
H: | 把模式空間中的內容追加至保持空間中 |
g: | 從保持空間取出數據覆蓋至模式空間 |
G: | 從保持空間取出內容追加至模式空間 |
x: | 把模式空間中的內容與保持空間中的內容進行互換 |
n: | 讀取匹配到的行的下一行覆蓋至模式空間 |
N: | 讀取匹配到的行的下一行追加至模式空間 |
w: | file 寫並追加模板塊到file末尾。 |
W: | file 寫並追加模板塊的第一行到file末尾。 |
d: | 刪除模式空間中的行 |
D: | 如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間重新啓動循環。如果模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環 |
地址定界示例:
地址界定&編輯命令示例:
sed -n '1p' passwd
#只打印第一行
ifconfig ens33 |sed -n 2p
#只顯示ens33網卡中的第二行
seq 11 |sed '6,10aqwe'
#從第六行起到第十行追加qwe
seq 11 |sed '6~2a\ qwe'
#從第六行起每隔兩行追加一次qwe ,\ 後邊是空格
seq 100 |sed -n '1~2p'
#步進,只顯示奇數行
seq 100 |sed -n '2~2p'
#步進,只顯示偶數行
sed -i.orig 's/dog/cat/g' pets
#備份後再替換
sed '2a\dog cat dog cat cat' pets
#在第二行後增加新行
sed '2i\dog cat dog cat cat' pets
#在第二行前增加新行
sed '2c\dog cat dog cat cat' pets
# 替換第二行
sed '2w /path/filename' pets
#將第二行保存到指定文件
sed '2r /path/filename' pets
#將指定文件讀取並加到第二行後
sed '=' pets 在顯示的結果前顯示行號
sed -n '/^#/!p' /etc/vsftpd.conf
#打印出以#開頭的行,然後用!進行反選,則表示過濾以#開頭的行,顯>
示非#開頭的行
sed -n '/^#/!{/^$/!p}'/etc/vsftpd.conf
#匹配以#開頭的行.進行反選,則打印出非#開頭的行,然後其結果在對
回車空白行開頭反選,表示過濾掉以#開頭的回車空白行
sed -e '/^#/d' -e '/^$/d' /
#刪除以#開頭的行;刪除回車空白行;sed支持對單個文件實現不同操作,每個
操作用-e 分隔
sed -n '1,/adm/p' /etc/passwd
#大金第一行到匹配adm的行,adm在文件的第4行
sed -n '/adm/,6p' /etc/passwd
#打印匹配adm的行到第6行
sed -n '1,/adm/,4p' /etc/passwd
#打印匹配dam的行到第4行,因爲adm也是第4行,所以只打印adm的行
sed -n '1,/adm/2p' /etc/passwd
#打印匹配adm的行到第2行,由於adm是第4行,所以只打印adm的行
sed '/^# Souruce/i\alias yy="yum -y install"' .bashrc
//初始化腳本:i\前邊的部分指定文件內容部位,i\後邊指定遷建內容,''後邊是文件明
高級用法 示例:
sed -n 'n;p' FILE
#顯示偶數行
sed '1!G;h;$!d' FILE #"1!"是第一行就不執行(不執行的部分執行後邊命令),不是第一行就執行G;再執行h;"$!"不是最後一行就執行d,是最後一行就不執行d。
#逆向顯示文件內容
sed 'N;D' FILE
#僅顯示最後一行
sed '$!N;$!D' FILE #"$!"不是最後一行執行N,是最後一行就不執行N,"$!"不是最後一行執行D,N讀取下一行,是最後一行不執行D,就輸出最後兩行。
#僅顯示文件最後兩行
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)把sed操作成功的行保存至另一文件中
[root@centos6 app]# cat 99file #sed操作的文件中的內容
1+1=1
1+2=2 2+2=4
1+3=3 2+3=6 3+3=9
1+4=4 2+4=8 3+4=12 4+4=16
1+5=5 2+5=10 3+5=15 4+5=20 5+5=25
1+6=6 2+6=12 3+6=18 4+6=24 5+6=30 6+6=36
1+7=7 2+7=14 3+7=21 4+7=28 5+7=35 6+7=42 7+7=49
1+8=8 2+8=16 3+8=24 4+8=32 5+8=40 6+8=48 7+8=56 8+8=64
1+9=9 2+9=18 3+9=27 4+9=36 5+9=45 6+9=54 7+9=63 8+9=72 9+9=81
[root@centos6 app]# sed -i 's/1+5=5/abcdefg/w abcdfile' 99file
#把sed操作的文件內容保存到另外一個文件中,w表示保存,abcdfile文件名
[root@centos6 app]# cat abcdfile #查看新文件的內容
abcdefg 2+5=10 3+5=15 4+5=20 5+5=25
[root@centos6 app]# cat 99file #查看原文件的內容
1+1=1
1+2=2 2+2=4
1+3=3 2+3=6 3+3=9
1+4=4 2+4=8 3+4=12 4+4=16
abcdefg 2+5=10 3+5=15 4+5=20 5+5=25
1+6=6 2+6=12 3+6=18 4+6=24 5+6=30 6+6=36
1+7=7 2+7=14 3+7=21 4+7=28 5+7=35 6+7=42 7+7=49
1+8=8 2+8=16 3+8=24 4+8=32 5+8=40 6+8=48 7+8=56 8+8=64
1+9=9 2+9=18 3+9=27 4+9=36 5+9=45 6+9=54 7+9=63 8+9=72 9+9=81
2)讀取一個文件內容,到sed操作的文件中
[root@centos6 app]# cat liufile #文件內容
hello word
how are you
liu
[root@centos6 app]# cat text #將用sed操作的文件的內容
1+1=1
1+2=2 2+2=4
1+3=3 2+3=6 3+3=9
1+4=4 2+4=8 3+4=12 4+4=16
1+5=5 2+5=10 3+5=15 4+5=20 5+5=25
1+6=6 2+6=12 3+6=18 4+6=24 5+6=30 6+6=36
1+7=7 2+7=14 3+7=21 4+7=28 5+7=35 6+7=42 7+7=49
1+8=8 2+8=16 3+8=24 4+8=32 5+8=40 6+8=48 7+8=56 8+8=64
1+9=9 2+9=18 3+9=27 4+9=36 5+9=45 6+9=54 7+9=63 8+9=72 9+9=81
[root@centos6 app]# sed -i '/2+5=10/r liufile' text
#在匹配2+5=10的行,讀進來另一個文件的內容,讀進來的文件的內容會插入到匹配2+5=10的行後
[root@centos6 app]# cat text #再次查看用sed命令操作的行
1+1=1
1+2=2 2+2=4
1+3=3 2+3=6 3+3=9
1+4=4 2+4=8 3+4=12 4+4=16
1+5=5 2+5=10 3+5=15 4+5=20 5+5=25
hello word
how are you
liu
1+6=6 2+6=12 3+6=18 4+6=24 5+6=30 6+6=36
1+7=7 2+7=14 3+7=21 4+7=28 5+7=35 6+7=42 7+7=49
1+8=8 2+8=16 3+8=24 4+8=32 5+8=40 6+8=48 7+8=56 8+8=64
1+9=9 2+9=18 3+9=27 4+9=36 5+9=45 6+9=54 7+9=63 8+9=72 9+9=81
3)利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig eth0 |sed -n '2p' 6系統
ifconfig ens33 |sed -n '2p' 7系統
ifconfig ens33 |sed -n '/netmask/p' #-n 不輸出模式空間到屏幕,-p打印當前模式空間內容,追加到默認輸出之後
6系統
[root@centos6 app]# ifconfig eth0 |sed -n '2p' |sed 's/^.r://'|sed 's/ .$//'
172.18.250.249[root@centos6 app]# ifconfig eth0 |sed -n -e '2s/^.r://' -e '2s/ .$//p'
172.18.250.249
7系統
[root@centos7 ~]# ifconfig ens33 |sed -n -e '2s/.et //' -e '2s/ .$//p'
172.18.250.135[root@centos7 ~]# ifconfig ens33 |sed '2!d;s/.et //;s/ .$//'
172.18.250.135
4)處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@centos6 etc]# echo /etc/fstab/ |sed -r 's@(/./)(\<./?)@\1@'
/etc/
[root@centos6 etc]# echo /etc/fstab |sed -r 's@(/./)(\<./?)@\2@'
fstab
[root@centos6 etc]#
5)統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重複次數
/media/CentOS_6.9_Final/Packages
/run/media/root/CentOS 7 x86_64/Packages[root@centos6 Packages]#ls .rpm|rev |cut -d. -f1,2|rev|cut -d. -f1|sort |uniq -c |sort -rn
x86_64
noarch
i686
[root@centos6 Packages]#ls .rpm |egrep -o ".[^.].rpm"|sort|cut -d. -f 2 |uniq -c|sort -rn
x86_64
noarch
i686
[root@centos6 Packages]#ls .rpm|sed -r 's@.[^.]$@@g' |sed -r 's@.(.[^.]$)@\1@'|sort|cut -d. -f2|uniq -c |sort -rn
x86_64
noarch
i686
[root@centos6 Packages]#ls .rpm|sed -r 's@..([^.]).rpm@\1@'|sort |uniq -c|sort -rn
x86_64
noarch
i686
6)、處理以下文件內容,將域名取出並進行計數排序,如處理:
http://www.baidu.com/index.<a target="_blank" href="http://www.2cto.com/kf/qianduan/css/" class="keylink" style="border:none; padding:0px; margin:0px; color:rgb(51,51,51); text-decoration:none; font-size:14px">html</a> http://www.baidu.com/1.html http://post.baidu.com/index.html http://mp3.baidu.com/index.html http://www.baidu.com/3.html http://post.baidu.com/2.html 得到如下結果: -額 域名的出現的次數 域名 3 www.baidu.com 2 post.baidu.com 1 mp3.baidu.com [root@centos6 app]# cat file |sed -e 's@http://@@' -e 's@/.*@@' |tr -s ' ' |sort|uniq -c|sort -rn 3 www.baidu.com 2 post.baidu.com 1 mp3.baidu.com [root@codfei4 shell]# awk -F/ '{print $3}' file |sort -r|uniq -c|awk '{print $1"\t",$2}' 3 www.baidu.com 2 post.baidu.com 1 mp3.baidu.com
以上是我自己學習總結的sed命令簡單的用法,sed還有更高級的用法,也還在學習中。