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还有更高级的用法,也还在学习中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值