您的位置:首页 > 运维架构 > Shell

shell编程学习之sed

2012-02-22 17:13 447 查看
sed

sed是流编辑器,是一个过滤工具,处理行

1、sed参数

p 打印匹配行

= 显示文件行号

a / 在定位行号后附加新文本信息

i / 在定位行号后插入新文本信息

d 删除定位行

c / 用新文本替换定位文本

s 使用替换模式替换相应模式

r 从另一个文件中读文本

w 写文本到一个文件

q 第一个模式匹配完成后推出或立即推出

l 显示与八进制A S C I I代码等价的控制字符

{ } 在定位行执行的命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式2粘贴到/pattern n/

y 传送字符

n 延续到下一输入行;允许跨行的模式匹配语句

2、替换一个或者多个

[test@linux-3 ~]# sed '1s/a/c/' 1.txt

[test@linux-3 ~]# cat 1.txt

a

a

a

b

[test@linux-3 ~]# sed '1s/a/c/' 1.txt

c

a

a

b

[test@linux-3 ~]# sed 's/a/c/g' 1.txt

c

c

c

b

3、打印1到3行

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed -n '1,3p' 1.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

4、删除1到3行

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed '1,3d' 1.txt #命令

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

5、选取一个范围

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed -n '/root/,/2/p' 1.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

6、删除第二行(包括第二行)后面的行

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed '2,$d' 1.txt #命令

root:x:0:0:root:/root:/bin/bash

7、删除包括某个字符所有的行

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed '/nologin/d' 1.txt #命令

root:x:0:0:root:/root:/bin/bash

8、匹配类型:0000:11或者0000:12 生日号

[test@linux-3 ~]# cat 3.txt

1986:10 aaaaa

1977:1 bbbbb

1986:11 aaaaa

1979:1 bbbbb

1977:12 bbbbb

1986:12 aaaaa

[test@linux-3 ~]# sed -ne '/[0-9]\{4\}\:1[12]/p' 3.txt

1986:11 aaaaa

1977:12 bbbbb

1986:12 aaaaa

9、在某个字符前面加#号,一般用于配置注释

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed 's/root/#&/' 1.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

10、删除第一和第二行,并在daemon前面加上#号

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed -e '1,2d' -e 's/daemon/#&/' 1.txt

#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

11、在某个字符后面读入另一文件

[test@linux-3 ~]# cat 1.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

[test@linux-3 ~]# sed '/daemon/r 3.txt' 1.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

1986:10 aaaaa

1977:1 bbbbb

1986:11 aaaaa

1979:1 bbbbb

1977:12 bbbbb

1986:12 aaaaa

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

12、匹配到并写入到另一个文件,但被写放的文件会被覆盖

[root@linux-3 ~]# cat 3.txt

root:x:0:0:root:/root:/bin/bash

[root@linux-3 ~]# sed -n '/daemon/w 3.txt' 1.txt

[root@linux-3 ~]# cat 3.txt

daemon:x:2:2:daemon:/sbin:/sbin/nologin

13、匹配某个字符再追加,一般在匹配的后面追加

[root@linux-3 ~]# sed '/root/a test test' 1.txt

root:x:0:0:root:/root:/bin/bash

test test

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

14、匹配后插入,一般在匹配的前面插入

[root@linux-3 ~]# sed '/^daemon/i test test' 1.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

test test

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

15、匹配以test开头,修改1234/1234/13456变成12/13/476

[root@linux-3 ~]# cat txt

test 1234/1234/13456

yoyo abcd/EFGH/MJKL

[root@linux-3 ~]# sed -n '/^test/p' txt |sed 's/[0-9]\{4\}\/[0-9]\{4\}\/[0-9]\{4\}/12\/13\/47/'

test 12/13/476

16、同样以txt为例,匹配yoyo,修改 abcd/EFGH/MJKL变成aaaa:aaaa:aaaa

[root@linux-3 ~]# cat txt

test 1234/1234/13456

yoyo abcd/EFGH/MJKL

[root@linux-3 ~]# sed -n '/^yoyo/p' txt | sed 's/[a-z]\{4\}\/[A-Z]\{4\}\/[A-Z]\{4\}/aaaa\:aaaa\:aaaa/'

yoyo aaaa:aaaa:aaaa

17、删除空格以及空白行

[root@linux-3 ~]# cat txt

test 1234/1234/13456

yoyo abcd /EFGH/MJKL

[root@linux-3 ~]# sed 's/[[:space:]]//g' txt #删除空格

test1234/1234/13456

yoyoabcd/EFGH/MJKL

[root@linux-3 ~]# sed 's/[[:space:]]//g' txt|sed '/^$/d' #删除空格以及空白行

test1234/1234/13456

yoyoabcd/EFGH/MJKL

18、除了nologn结尾的,其他删除

[root@linux-3 ~]# sed '/nologin$/! d' 1.txt

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

19、小写变成大写

[root@linux-3 ~]# sed 'y/root/ROOT/' 1.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

20、打印第三行后面所有字符

[root@linux-3 ~]# sed '3q' 1.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

21、root这个单词用[ ]括起来

[root@linux-3 ~]# cat 1.txt | sed 's/root\+/[&]/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

22、查找出root开头的,并把所有单词使用[ ]括起来

[root@linux-3 ~]# sed -n '/^root/p' 1.txt | sed 's/\w\+/[&]/g'

[root]:[x]:[0]:[0]:[root]:/[root]:/[bin]/[bash]

23、在指定行插入

[root@linux-3 ~]# sed '2i test' 1.txt

root:x:0:0:root:/root:/bin/bash

test

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

24、在前面加上test 这个单词

[root@linux-3 ~]# sed 's/^/test /' 1.txt

test root:x:0:0:root:/root:/bin/bash

test bin:x:1:1:bin:/bin:/sbin/nologin

test daemon:x:2:2:daemon:/sbin:/sbin/nologin

test adm:x:3:4:adm:/var/adm:/sbin/nologin

test lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

25、在后面加上 test这个单词

[root@linux-3 ~]# sed 's/$/ test/' 1.txt

root:x:0:0:root:/root:/bin/bash test

bin:x:1:1:bin:/bin:/sbin/nologin test

daemon:x:2:2:daemon:/sbin:/sbin/nologin test

adm:x:3:4:adm:/var/adm:/sbin/nologin test

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin test

26、只在单词nologin所在的行后面加上 test这个单词

[root@linux-3 ~]# cat 1.txt |sed -n '/nologin$/p' | sed -e 's/$/ test/'

bin:x:1:1:bin:/bin:/sbin/nologin test

daemon:x:2:2:daemon:/sbin:/sbin/nologin test

adm:x:3:4:adm:/var/adm:/sbin/nologin test

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin test

本文出自 “游造技术博客” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: