您的位置:首页 > 其它

sed 应用案例

2017-12-09 00:00 78 查看
摘要: 将不定期补充......

sed是什么?

sed命令是一个面向行处理的工具,它以"行"为处理单位,处理后的结果会输出到标准输出

sed的工作原理

sed会把要处理的行存储在缓冲区中,接着sed命令处理缓冲区的内容,处理完成后把缓冲区内容送往屏幕,这个缓冲区称为"模式空间".

d 表示删除行

[root@linux01 ~]# cat file1.txt
test 1
one two three proce
test 2
test test file
[root@linux01 ~]# sed '/2/d' file1.txt
test 1
one two three proce
test test file

/2/d表示把文件中包含2的行删除

提取文件中每行的第一个域内容

[root@linux01 ~]# head -n5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@linux01 ~]# head -n5 /etc/passwd|sed 's/:.*$//'
root
bin
daemon
adm
lp

s 表示替换的作用,用法 s/SOURCE/DEST/ ,匹配SOURCE内容替换成DEST内容,":.*$"表示匹配行中第一个:(冒号)开始到行末内容清空处理

输出匹配内容的行

[root@linux01 ~]# head -n5 /etc/passwd|sed '/root/p'
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@linux01 ~]# head -n5 /etc/passwd|sed -n '/root/p'
root:x:0:0:root:/root:/bin/bash

n 可以让sed输出匹配内容的行,不然它会先输出处理的行,再执行后面的动作

输出一定范围的内容

[root@linux01 ~]# sed -n '1,5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

输出1到5行的内容

替换的另一个用法 "/^[dr]/s/b/B/g"中"^[dr]"表示匹配以d或r开头的行,s/xx/xx/g表示将所有xx替换成xx

[root@linux01 ~]# head -n5 /etc/passwd| sed '/^[dr]/s/b/B/g'
root:x:0:0:root:/root:/Bin/Bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sBin:/sBin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


删除每行中最后两个字符,"..$"中"."表示匹配任意一个字符,"$"表示行末结束符

[root@linux01 ~]# head -n5 /etc/passwd| sed 's/..$//'
root:x:0:0:root:/root:/bin/ba
bin:x:1:1:bin:/bin:/sbin/nolog
daemon:x:2:2:daemon:/sbin:/sbin/nolog
adm:x:3:4:adm:/var/adm:/sbin/nolog
lp:x:4:7:lp:/var/spool/lpd:/sbin/nolog


删除每行前两个字符

[root@linux01 ~]# head -n5 /etc/passwd| sed 's/..//'
ot:x:0:0:root:/root:/bin/bash
n:x:1:1:bin:/bin:/sbin/nologin
emon:x:2:2:daemon:/sbin:/sbin/nologin
m:x:3:4:adm:/var/adm:/sbin/nologin
:x:4:7:lp:/var/spool/lpd:/sbin/nologin


& 在sed中指代前面被匹配的部分

[root@linux01 ~]# head -n5 /etc/passwd| sed 's/nologin/&2014/'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin2014
daemon:x:2:2:daemon:/sbin:/sbin/nologin2014
adm:x:3:4:adm:/var/adm:/sbin/nologin2014
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin2014


() 在sed的用法 我们称为"sed的预存储技术",()的内容被依次暂存起来,存储在\N里面,方便调用处理

[root@linux01 ~]# head -n1 /etc/passwd| sed 's/\(root\)\(.*\)\(bash\)/\3\2\1/'
bash:x:0:0:root:/root:/bin/root


定位内容的另一方法

[root@linux01 ~]# head -n5 /etc/passwd| sed -n '/0/,/3/p'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


-e 选项可设置多个command,使用-e选项后面只能跟command内容不能再夹杂其他选项

[root@linux01 ~]# head -n5 /etc/passwd| sed -ne '1,2p' -e '5p'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


从文件中读取command内容,我们可以把常用的规则写进文件,方便平时工作使用

[root@linux01 ~]# cat test.txt
/0/,/3/p
[root@linux01 ~]#  head -n5 /etc/passwd| sed -nf test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


在匹配行下插入文件内容

[root@linux01 ~]#  head -n5 /etc/passwd| sed '/2/r test.txt'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
/0/,/3/p
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


在匹配行下插入自定义内容 a\后跟自定义内容即可

[root@linux01 ~]#  head -n5 /etc/passwd| sed '/2/a\===command==='
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
===command===
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


在匹配行上插入自定义内容 i\后跟自定义内容即可

[root@linux01 ~]#  head -n5 /etc/passwd| sed '/2/i\===before==='
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
===before===
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


y 表示按字符依次替换,如果第一次处理字符碰到自己替换自己时,后面的字符替换动作便失效

[root@linux01 ~]#  head -n5 /etc/passwd| sed 'y/oo/Bo/'
rBBt:x:0:0:rBBt:/rBBt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nBlBgin
daemBn:x:2:2:daemBn:/sbin:/sbin/nBlBgin
adm:x:3:4:adm:/var/adm:/sbin/nBlBgin
lp:x:4:7:lp:/var/spBBl/lpd:/sbin/nBlBgin
[root@linux01 ~]#  head -n5 /etc/passwd| sed 'y/oo/oB/'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


隔行操作

[root@linux01 ~]#  head -n5 /etc/passwd| sed 'n;s/bin/MOM/g'
root:x:0:0:root:/root:/bin/bash
MOM:x:1:1:MOM:/MOM:/sMOM/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sMOM/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


将指定行写入特定文件中

[root@linux01 ~]#  head -n5 /etc/passwd| sed '/root/w new.txt'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@linux01 ~]# cat new.txt
root:x:0:0:root:/root:/bin/bash


归纳一下

常用动作 r a i p w d s y n

常用选项 -f -e -n
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: