sed

1、sed的定义

sed是一种流编辑器,按行处理,一次处理一行内容

处理方式:如果只是展示,会放在缓冲区(模式空间),展示结束后,会从模式空间把操作结果删除

一行一行处理,处理完当前行才会处理下一行,直到文件末尾。

作用:对文本的内容进行增删改查,最好用的是改和增

2、sed的命令格式和操作选项

sed -e ‘操作符’ -e '操作符' 文件1 文件2

-e表示可以跟多个操作符,只有一个操作,-e可以省略

sed -e '操作符1;操作符2' 文件 文件2

2.1选项

-e:用于执行多个操作命令

-f:在脚本中定义好了操作符,然后根据脚本内容的操作符对文件进行操作

-i:直接修改目标文件(慎用)

-n:仅显示script处理后的结果(不加-n,sed会有两个输出结果,加了-n就会把默认输出屏蔽,只显示一个结果)

2.2操作符

p:打印结果

r:使用扩展正则表达式

s:替换,替换字符串

c:替换,替换行

y:替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致

d:删除,删除行

a:增加,在指定行的下一行插入内容

i:增加,在指定行的上一行插入内容

r:在行后增加文本内容(将读取的文件内容添加到对象文件中)

$a:在最后一行插入新的内容

$i:在倒数第二行插入新的内容

$r:读取其他文件的内容,然后插入到对象文件的最后一行

3、sed的打印功能

3.1寻址打印

sed -n '=' 只显示行号

[root@test1 opt]# sed -n '=' test1.txt


1
2
3
4

sed -n '=;p' 既显示行号又显示内容

[root@test1 opt]# sed -n '=;p' test1.txt

1
aaa
2
bbb
3
ccc
4
ddd
5
eee
6
fff
7
ggg
8
hhh
9
iii

打印指定的行:sed -n '4p'

[root@test1 opt]# sed -n '4p' test1.txt

ddd

打印最后一行:sed -n '$p'

[root@test1 opt]# sed -n '$p' test1.txt


iii

3.2行号范围打印

打印2-4行:sed -n ‘2,4p’

[root@test1 opt]# sed -n '2,4p' test1.txt

bbb
ccc
ddd

打印2-最后一行:sed-n ‘2,$p’

[root@test1 opt]# sed -n '2,$p' test1.txt

bbb
ccc
ddd
eee
fff
ggg
hhh
iii

打印第2行和最后一行:sed-n ‘2p;$p’

[root@test1 opt]# sed -n '2p;$p' test1.txt

bbb
iii

3.3打印奇数行和偶数行

奇数行:sed-n ‘p;n’

n的作用,跳过一行,打印下一行

[root@test1 opt]# sed -n 'p;n' test1.txt

aaa
ccc
eee
ggg
iii

偶数行:sed-n ‘n;p’

[root@test1 opt]# sed -n 'n;p' test1.txt

bbb
ddd
fff
hhh

4、对文本内容进行过滤

sed -n '/a/p' 过滤并打印包含a的行

[root@test1 opt]# sed -n '/a/p' test1.txt

aaa
cacc
eeae
fffa

使用正则表达式对文本内容进行过滤

sed -n '/^root/p' /etc/passwd 打印以root为开头的行

[root@test1 opt]# sed -n '/^root/p' /etc/passwd

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

sed -n '33,/bash$/p'从指定行开始,打印到第一个以bash为结尾的行

[root@test1 opt]# sed -n '33,/bash$/p' /etc/passwd

geoclue:x:992:986:User for geoclue:/var/lib/geoclue:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sssd:x:991:985:User for sssd:/:/sbin/nologin
……

打印至少有两个99:的行

[root@test1 opt]# sed -rn '/(99:){2,}/p' /etc/passwd

nobody:x:99:99:Nobody:/:/sbin/nologin

要么以root为开头,要么以bash为结尾的行

[root@test1 opt]# sed -rn '/^root|bash$/p' /etc/passwd

root:x:0:0:root:/root:/bin/bash
test1:x:1000:1000:test1:/home/test1:/bin/bash
dn:x:1001:1001::/home/dn:/bin/bash
test2:x:1011:1011::/home/test2:/bin/bash

面试题:如何免交互删除文本内容,不删除文件

sed -i ‘d’ 文件名

cat /dev/null > 文件名

5、sed的删除操作

sed -n '3d;p' 删除第三行,打印剩余的行

[root@test1 opt]# sed -n '3d;p' test1.txt

111
222
444
555
666
777
888
999
000

sed -n '5,$d;p' 删除第五行到最后一行,打印剩余的行

[root@test1 opt]# sed -n '5,$d;p' test1.txt 

111
222
333
444

sed -n '1!d;p' 除了第一行其他的都删除

[root@test1 opt]# sed -n '1!d;p' test1.txt 

111

sed -n ‘4,6!d;p’ 除了第四行到第六行,其他的都删除

[root@test1 opt]# sed -n '4,6!d;p' test1.txt

444
555
666

sed -n '4d;6d;p' 除了第四行和第六行,其他的都打印

[root@test1 opt]# sed -n '4d;6d;p' test1.txt

111
222
333
555
777
888
999
000

sed -i -e '1,3d' 除了第四行和第六行,其他的都删除

[root@test1 opt]# sed -i -e '1,3d' -e '5d' -e '7,$d' test1.txt
[root@test1 opt]# cat test1.txt

444
666

6、匹配字符串进行删除行

sed '/a/d' 删除所有包含a的行

[root@test1 opt]# sed '/a/d' test1.txt


bhdbh nj
hx sjdh
wud ndhcbdh dd

面试题:如何免交互删除空行?

sed '/^$/d' 文件名

cat 文件名 | tr -s "\n"

grep -v "^$" 文件名

7、s替换字符串

sed -n 's/root/test/p' 把root替换成test(只替换第一个root)

[root@test1 opt]# sed -n 's/root/test/p' /etc/passwd


test:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/test:/sbin/nologin

sed -n 's/root/test/gp' 把所有的root都替换成test

[root@test1 opt]# sed -n 's/root/test/gp' /etc/passwd

test:x:0:0:test:/test:/bin/bash
operator:x:11:0:operator:/test:/sbin/nologin

sed -n 's/^/#/p' 每一行都加#注释掉

[root@test1 opt]# sed -n 's/^/#/p' test1.txt

#111
#222
#333
#444
#555
#666
#777
#888
#999
#000

注释第四行到第六行

[root@test1 opt]# sed -n '4,6 s/^/#/p' test1.txt

#444
#555
#666

注释第四行和第六行

[root@test1 opt]# sed -n '4,6 s/^/#/p' test1.txt

#444
#555
#666

8、对字母进行大小写替换

8.1小写替换成大写

sed 's/[a-z]/\u&/' 文件名 首字母变成大写

u&转换首字母大写的特殊符号,\转义符

[root@test1 opt]# sed 's/[a-z]/\u&/' test1.txt


Aaa
Bbb
Ccc
Ddd

sed 's/[a-z]/\u&/g' 文件名 把所有的小写都变成大写

[root@test1 opt]# sed 's/[A-Z]/\l&/' test1.txt


aAA
bBB
cCC
dDD

8.2大写替换成小写

sed 's/[A-Z]/\l&/' 文件名 首字母变成小写

[root@test1 opt]# sed 's/[A-Z]/\l&/' test1.txt


aAA
bBB
cCC
dDD

sed 's/[A-Z]/\l&/g' 文件名 把所有的小写都变成小写

[root@test1 opt]# sed 's/[A-Z]/\l&/g' test1.txt


aaa
bbb
ccc
ddd

9、整行替换

sed '/原内容/c 替换内容' 文件名

面试题:替换ip地址

原ip地址:IPADDR=192.168.230.10

替换之后的ip地址:IPADDR=192.168.230.100

[root@test1 opt]# sed '/IPADDR=192.168.230.10/c IPADDR=192.168.230.100' /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.230.100
NETMASK=255.255.255.0
GATEWY=192.168.230.2
DNS1=218.2.135.1

10、y单字符替换

把one替换成123,替换的字符串长度要相同

[root@test1 opt]# sed 'y/one/123/' test1.txt
123
tw1
thr33
f1ur
fiv3
six
s3v32
3ight
2i23
t32

11、使用sed对字符串和字符的位置进行互换

字符串互换位置

[root@test1 opt]# echo abc | sed -r 's/(a)(b)(c)/\3\1\2/'


cab

单个字符互换位置

[root@test1 opt]# echo 早上好 | sed -r 's/(.)(.)(.)/\3\2\1/'

好上早

面试题1:提取出文本的型号

ant-1.9.7.jar

ant-launcher-1.9.7.jar

antlr-2.7.7.jar

antlr-runtime-3.4.jar

aopalliance-1.0.jar

archaius-core-0.7.6.jar

asm-5.0.4.jar

aspectjweaver-1.9.5.jar

bcpkix-jdk15on-1.64.jar

bcprov-jdk15-1.46.jar

bcprov-jdk15on-1.64.jar

checker-compat-qual-2.5.5.jar

方法1:

[root@test1 opt]# cat lianxi.txt | grep -E "[0-9]+\."


ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar

方法2:

[root@test1 opt]# cat lianxi.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'


1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

面试题2:

打印指定时间内的日志

[root@test1 opt]# sed -n '/Jun 17 10:50:01/,/Jun 17 11:40:01/p' /var/log/messages


Jun 17 10:50:01 test1 systemd: Started Session 74 of user root.
Jun 17 11:00:01 test1 systemd: Started Session 75 of user root.
Jun 17 11:01:01 test1 systemd: Started Session 76 of user root.
Jun 17 11:10:01 test1 systemd: Started Session 77 of user root.
Jun 17 11:13:26 test1 chronyd[8756]: Selected source 185.209.85.222
Jun 17 11:20:01 test1 systemd: Started Session 78 of user root.
Jun 17 11:22:01 test1 systemd: Removed slice User Slice of root.
Jun 17 11:30:01 test1 systemd: Created slice User Slice of root.
Jun 17 11:30:01 test1 systemd: Started Session 79 of user root.
Jun 17 11:30:01 test1 systemd: Removed slice User Slice of root.
Jun 17 11:40:01 test1 systemd: Created slice User Slice of root.
Jun 17 11:40:01 test1 systemd: Started Session 80 of user root.
Jun 17 11:40:01 test1 systemd: Removed slice User Slice of root.

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值