Linux sed

sed 行編輯器

目錄
語法及常用選項
地址定界
編輯命令
查找替換
sed元字符集
高級編輯命令
示例拓展

語法及常用選項

Linux 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:] 所有標點符號

查找替換

Linux sed

高級編輯命令

選項 功能
P: 打印模式空間開端至\n內容,並追加到默認輸出之前
P: (大寫) 打印模板塊的第一行
q: 退出Sed
h: 把模式空間中的內容覆蓋至保持空間中
H: 把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G: 從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N: 讀取匹配到的行的下一行追加至模式空間
w: file 寫並追加模板塊到file末尾。
W: file 寫並追加模板塊的第一行到file末尾。
d: 刪除模式空間中的行
D: 如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間重新啓動循環。如果模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環

地址定界示例:

Linux sed

Linux sed

地址界定&編輯命令示例:

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.&lt;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"&gt;html&lt;/a&gt;  
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還有更高級的用法,也還在學習中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章