sed
动 作 | 解释 | – |
---|---|---|
a | 新增 | a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ |
c | 取代 | c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! |
d | 删除 | 因为是删除啊,所以 d 后面通常不接任何咚咚; |
i | 插入 | i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); |
p | 打印 | 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ |
s | 取代 | 可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! |
^开头 $结尾
加个!转义词转义就是不显示空
sed特殊正则
sed里有些正则和普通的正则语法不太一样,下面列出一些sed特殊语法的正则。
\+ #匹配一次或多次
\? #匹配零次或一次
\| #或语法
查看文件某一行
先用seq生成序列
[root@shell ~ 48]# seq 5
1
2
3
4
5
###seq的作用
##生成50个数字序列重定向到文件中
[root@shell ~ 49]# seq 50 > zheng.txt
显示第一行,-n用来取消默认输出,不加-n 要不然sed默认显示文件所有内容
p是打印 print的意思
[root@shell ~ 55]# sed -n '3p' zheng.txt
3
查看文件几行到几行
用逗号隔开数字,p在最后
[root@shell ~ 56]# sed -n '10,15p' zheng.txt
10
11
12
13
14
15
查看文件的好多行
可以看到,这里显示行号空格也算行,但是用nl显示空行不显示行号
,所以用cat -n或者grep -n
[root@zheng /]# nl /zyf/jianli.txt
1 I am student!
2 I like Liunx.
3 I like basketball
4 I like badminton ball ,billiard ball and chinese chess!
5 my blog is http://oldboy.blog.51cto.com
6 our size is http://blog.oldoyedu.com
7 2020-08-18
8 my WeChat is 13522828457
9 not 490000448.
10 my god ,i an not oldbey,but OlDEBOY!
11 ....******!!!!!!!|||||||#####^^^^^
12 2020-08-20
[root@zheng /]# sed -n '1p;8p;11p' /zyf/jianli.txt
I am student!
2020-08-18
not 490000448.
[root@zheng /]# cat -n /zyf/jianli.txt
1 I am student!
2 I like Liunx.
3
4 I like basketball
5 I like badminton ball ,billiard ball and chinese chess!
6 my blog is http://oldboy.blog.51cto.com
7 our size is http://blog.oldoyedu.com
8 2020-08-18
9 my WeChat is 13522828457
10
11 not 490000448.
12 my god ,i an not oldbey,but OlDEBOY!
13 ....******!!!!!!!|||||||#####^^^^^
14 2020-08-20
搜索文件信息
搜索一种信息
-n 取消默认输出
搜索有blog的行
搜索字符要用两个 / /包起来
/要搜索的内容/p
[root@zheng ~]# sed -n '/blog/p' /zyf/jianli.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
搜索一种以上的信息
-r 在脚本中使用扩展正则表达式,要不然后面的 | 参数会报错
搜索blog和135所在的行
中间的丨是分隔开,什么和什么的意思
[root@zheng ~]# sed -nr '/blog|135/p' /zyf/jianli.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
my WeChat is 13522828457
搜索从这个字符到另一个字符之间的所有行
nl +文件名显示行号
搜索从blog到not之间的行
用于查日志,搜索从多少时间到多少时间
'/搜索的第一个字符/,/搜索的第二个字符/p'
[root@zheng ~]# nl /zyf/jianli.txt |sed -n '/blog/,/not/p'
5 my blog is http://oldboy.blog.51cto.com
6 our size is http://blog.oldoyedu.com
7 my WeChat is 13522828457
8 not 490000448.
日志搜索日期到日期
先添加两行日期
在第8行和最后一行添加两个日期
[root@zheng /]# sed -i '7a\2020-08-18\' /zyf/jianli.txt
[root@zheng /]# sed -i '$a\2020-08-20\' /zyf/jianli.txt
查看两个日期中间的信息
[root@zheng /]# sed -nr '/2020-08-18/,/2020-08-20/p' /zyf/jianli.txt
2020-08-18
my WeChat is 13522828457
not 490000448.
my god ,i an not oldbey,but OlDEBOY!
....******!!!!!!!||
查看文件内的奇偶数行
[root@zheng /]# seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@zheng /]# seq 10 |sed -n '0~2p'
2
4
6
8
10
搜索从这个字符的所在行到最后一行信息
nl显示行号
$是最后一行,不是正则表达式,所以不用加 / /
但是前面的的字符需要加 / /
从WeChat到到最后一行
[root@zheng ~]# nl /zyf/jianli.txt |sed -n '/WeChat/,$p'
7 my WeChat is 13522828457
8 not 490000448.
9 my god ,i an not oldbey,but OlDEBOY!
10 ....******!!!!!!!|||||||#####^^^^^
在显示内容的时候加上别的信息
在第7行后加上looper,显示在第8行
注意是显示添加,并不实际加入到文件中,只显示
[root@shell ~ 6]# sed -e 7a\looper sed.txt
uzi!!!
xiaohu
mlxg
letme
ming
karsa
heart
looper
mata
Zz1tai
gogogo!!!
替换内容
‘s#需要被替换的#替换的#g’
让他显示到屏幕上是被替换的
注意现在只是显示出来是替换的,并没有改文件的内容
[root@shell ~ 85]# cat >/root/sed.txt <<EOF
uzi
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
dddd
>
> EOF
[root@shell ~ 86]# cat sed.txt
uzi
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
dddd
[root@shell ~ 87]# sed 's#dddd#gogogo!!!#g' /root/sed.txt
uzi
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
gogogo!!!
要是修改文件内容的话需要加上 -i 参数
-i 修改文本内容
一般不直接使用-i,先用替换查询一下,查看没出错以后在加上-i参数
[root@shell ~ 90]# sed -i 's#dddd#gogogo!!!#g' /root/sed.txt
[root@shell ~ 91]# cat sed.txt
uzi
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
gogogo!!!
## 替换文件的时候备份
-i 后面加扩展名可以直接加到这个源文件的后面
一个该之前的一个改之后的
```c
[root@shell ~ 3]# sed -i.bak 's#uzi#uzi!!!#g' sed.txt
[root@shell ~ 4]# cat sed.txt
uzi!!!
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
gogogo!!!
[root@shell ~ 5]# cat sed.txt
sed.txt sed.txt.bak
[root@shell ~ 5]# cat sed.txt.bak
uzi
xiaohu
mlxg
letme
ming
karsa
heart
mata
Zz1tai
gogogo!!!
将第5-10行的内容取代成为gogog!!!
这个也只是列出而已,并没有写入文件,如果要写入可以直接在sed后面加上-i 参数
[root@shell ~ 56]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 mata> able
6 mata > able
7 mata able
8 matable
9 ming
10 ming
[root@shell ~ 57]# nl sed.txt |sed '5,10c gogogo!!!'
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
gogogo!!!
查询ip地址并过滤掉其他内容
先查询 ens33网卡信息
/sbin/ifconfig和ifconfig是一样的
[root@zheng ~]# /sbin/ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::299c:3370:1a37:a22d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0c:2b:06 txqueuelen 1000 (Ethernet)
RX packets 1841265 bytes 2078480780 (1.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 372021 bytes 174680960 (166.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
只匹配inet内容的行,inet后面要加一个空格要不然inet6一起显示出来
[root@zheng ~]# ifconfig ens33 |grep 'inet '
inet 192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
把ip开头的inet去掉,两种方法
1
[root@zheng ~]# ifconfig ens33 |grep 'inet ' |sed 's/^.*inet//g'
192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
2
[root@zheng ~]# ifconfig ens33 |grep 'inet ' |sed 's/inet/ /g'
192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
只保留ip地址,后面的内容全部去掉
[root@zheng ~]# ifconfig ens33 |grep 'inet ' |sed 's/inet/ /g'|sed 's/netmask.*$//g'
192.168.100.10
用替换来删除
随便找个文件
s == substitute sub 替换
g == global 全局,会默认替换第一个匹配的字符
把所有数字都替换成空 ‘s#[0-9]##g’
把第一列数字替换成空 ‘s#[0-9]##’
[root@zheng ~]# cat test.txt
金 211324198415244720
万 500224197105168312
万 646461asd
任 123123123zyf
任 linux6543454345354
任 j516515615635433
任 50182197306dagasdd
吕 21128219920911303X
空 150000019321112611
控 255133215131525131
向 19264611813621162X
杜 11010151351332153x
[root@zheng ~]# sed 's#[0-9]##g' test.txt
金
万
万 asd
任 zyf
任 linux
任 j
任 dagasdd
吕 X
空
控
向 X
杜 x
[root@zheng ~]# sed 's#[0-9]##' test.txt
金 11324198415244720
万 00224197105168312
万 46461asd
任 23123123zyf
任 linux543454345354
任 j16515615635433
任 0182197306dagasdd
吕 1128219920911303X
空 50000019321112611
控 55133215131525131
向 9264611813621162X
杜 1010151351332153x
添加内容
添加一行内容
[root@shell ~ 9]# sed -i 7a\looper sed.txt
[root@shell ~ 10]# cat sed.txt
uzi!!!
xiaohu
mlxg
letme
ming
karsa
heart
looper
mata
Zz1tai
gogogo!!!
添加多行内容
在最后一行添加test111和test22
[root@zheng ~]# nl sed.txt |sed '$a\test111\
> test22'
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 ming
6 karsa
7 heart
8 looper
9 mata
10 Zz1tai
11 gogogo!!!
test111
test22
[root@zheng ~]# nl sed.txt |sed -i '$a\test111\
test22'
sed: no input files #这里提示没有文件显示,加上那个文件内容名就好了
[root@zheng ~]# nl sed.txt |sed -i '$a\test111\
test22' sed.txt
[root@zheng ~]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 ming
6 karsa
7 heart
8 looper
9 mata
10 Zz1tai
11 gogogo!!!
12 test111
13 test22
删除内容并写入文件
将内容列出并且列印行号然后删除11行
#显示行号
[root@shell ~ 25]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 ming
6 karsa
7 heart
8 looper
9 mata
10 Zz1tai
11 gogogo!!!
[root@shell ~ 30]# sed -i '8,10d' sed.txt
[root@shell ~ 31]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 ming
6 karsa
7 heart
从第5行删除到最后一行
[root@shell ~ 32]# sed -i '5,$d' sed.txt
[root@shell ~ 33]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
写入内容
nl +file 显示行号,在第四行后,第五行加上ming
[root@shell ~ 45]# nl sed.txt|sed -i '4a ming' sed.txt
[root@shell ~ 48]# nl sed.txt
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 ming
添加空行
[root@zheng ~]# nl sed.txt |sed -i '1a \\' sed.txt
[root@zheng ~]# nl sed.txt
1 uzi!!!
2 AAABBBCCC
3 AAABBBCCC
4 xiaohu
5 mlxg
6 letme
7 ming
8 karsa
9 heart
10 looper
11 mata
12 Zz1tai
13 gogogo!!!
14 test111
15 test22
[root@zheng ~]# nl sed.txt |sed -i '1a \\n' sed.txt
[root@zheng ~]# nl sed.txt
1 uzi!!!
2 AAABBBCCC
3 AAABBBCCC
4 xiaohu
5 mlxg
6 letme
7 ming
8 karsa
9 heart
10 looper
11 mata
12 Zz1tai
13 gogogo!!!
14 test111
15 test22
数据的搜寻并显示
搜寻带有ming关键字的行
搜索匹配的行会和之前的一起显示出来
sed 后面 单引号括起来
搜索关键词用两个斜杠包起来最后加上 p
[root@shell ~ 7]# nl sed.txt |sed '/ma/p'
1 uzi!!!
2 xiaohu
3 mlxg
4 letme
5 mata> able
5 mata> able
6 mata > able
6 mata > able
7 mata able
7 mata able
8 matable
8 matable
9 ming
10 ming
这种方法看着很不清晰
所以要加一个-n 取消静默输出,让他只打印输出匹配行
[root@shell ~ 9]# nl sed.txt |sed -n '/mata/p'
5 mata> able
6 mata > able
7 mata able
8 matable
数据的搜寻并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
q : 是退出。
8 matable
[root@shell ~ 10]# cp /etc/passwd /root/passwd
[root@shell ~ 11]# nl sed.txt |sed -n '/root/{s/bash/blueshell/;p;q}'
[root@shell ~ 12]# nl /etc/passwd |sed -n '/root/{s/bash/blueshell/;p;q}'
1 root:x:0:0:root:/root:/bin/blueshell
[root@shell ~ 13]# nl /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.......
.......
........
......
多点编辑
删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
也是两种思路
1
[root@zheng ~]# nl /etc/passwd |sed '3,$d' |sed 's/bash/blueshell/g'
1 root:x:0:0:root:/root:/bin/blueshell
2 bin:x:1:1:bin:/bin:/sbin/nologin
2
[root@zheng ~]# nl /etc/passwd |sed -e '3,$d' -e 's/bash/blueshell/g'
1 root:x:0:0:root:/root:/bin/blueshell
2 bin:x:1:1:bin:/bin:/sbin/nologin
复杂操作
把每一行结尾为.的内容换成!号
.$当前行的最后
[root@zheng ~]# sed -i 's/\.$/\!/g' sed.txt
[root@zheng ~]# nl sed.txt
1 linux!
2 centos-
3 google!
4 taobao!
5 facebook!
6 zhihu-
7 weibo-
基础总结
d #删除行
sed '1,3d' test.xx #删除1到3行
a #新增行
sed '1a hello' test.txt #第1行后新增hello
i #插入行
sed '1i hello' test.txt #在第1行插入hello
c #替换行
sed '1c hello' test.txt #替换匹配行为hello
sed '/^SELINUX=/cSELINUX=disabled' test.txt
p #输出行(与-n选项配合)
sed -n '2p' test.txt #输出第2行
s #替换匹配字符串
sed 's/aa/AA/' test.txt #替换每一行遇到的第一个aa为AA
sed '2s/2/x/' test.txt #替换第2行的第一个2为x
sed '/^[0-9]/s/aa/AA/g' test.txt #替换以数字开头的行的所有aa为AA
g #一行里所有都匹配
sed 's/aa/AA/g' test.txt #替换一行里所有的aa为AA
a、i和c的使用
参数 | 意思 |
---|---|
a | append 追加 |
i | insert 插入 |
c | change 替换 |
a
一行下追加
[root@zheng /]# sed '1a11111111,test,!!!' /zyf/jianli.txt |cat -n
1 I am student!
2 11111111,test,!!!
3 I like Liunx.
4
5 I like basketball
6 I like badminton ball ,billiard ball and chinese chess!
7 my blog is http://oldboy.blog.51cto.com
8 our size is http://blog.oldoyedu.com
9 2020-08-18
10 my WeChat is 13522828457
11
12 not 490000448.
13 my god ,i an not oldbey,but OlDEBOY!
14 ....******!!!!!!!|||||||#####^^^^^
15 2020-08-20
| 多行追加
需要添加 -r 参数,正则表达式
[root@zheng /]# sed -r '/2020-08-18|2020-08-20/a!!!ABCDEFG!!!' /zyf/jianli.txt |cat -n
1 I am student!
2 I like Liunx.
3
4 I like basketball
5 I like badminton ball ,billiard ball and chinese chess!
6 my blog is http://oldboy.blog.51cto.com
7 our size is http://blog.oldoyedu.com
8 2020-08-18
9 !!!ABCDEFG!!!
10 my WeChat is 13522828457
11
12 not 490000448.
13 my god ,i an not oldbey,but OlDEBOY!
14 ....******!!!!!!!|||||||#####^^^^^
15 2020-08-20
16 !!!ABCDEFG!!!
\n 追加两行内容
在这两个日期下添家信息 /a
追加第二行,\n,\n代表回车,换行
[root@zheng /]# sed -r '/2020-08-18|2020-08-20/a!!!ABCDEFG!!!\n123123' /zyf/jianli.txt |cat -n
1 I am student!
2 I like Liunx.
3
4 I like basketball
5 I like badminton ball ,billiard ball and chinese chess!
6 my blog is http://oldboy.blog.51cto.com
7 our size is http://blog.oldoyedu.com
8 2020-08-18
9 !!!ABCDEFG!!!
10 123123
11 my WeChat is 13522828457
12
13 not 490000448.
14 my god ,i an not oldbey,but OlDEBOY!
15 ....******!!!!!!!|||||||#####^^^^^
16 2020-08-20
17 !!!ABCDEFG!!!
18 123123
i
[root@zheng /]# sed '1i11111111,test,!!!' /zyf/jianli.txt |cat -n
1 11111111,test,!!!
2 I am student!
3 I like Liunx.
4
5 I like basketball
6 I like badminton ball ,billiard ball and chinese chess!
7 my blog is http://oldboy.blog.51cto.com
8 our size is http://blog.oldoyedu.com
9 2020-08-18
10 my WeChat is 13522828457
11
12 not 490000448.
13 my god ,i an not oldbey,but OlDEBOY!
14 ....******!!!!!!!|||||||#####^^^^^
15 2020-08-20
c
[root@zheng /]# sed '13c sed -c;' /zyf/jianli.txt |cat -n
1 I am student!
2 I like Liunx.
3
4 I like basketball
5 I like badminton ball ,billiard ball and chinese chess!
6 my blog is http://oldboy.blog.51cto.com
7 our size is http://blog.oldoyedu.com
8 2020-08-18
9 my WeChat is 13522828457
10
11 not 490000448.
12 my god ,i an not oldbey,but OlDEBOY!
13 sed -c;
14 2020-08-20
过滤空格、连续空格、空行
1、空行
2、a空格回车
3、a回车
4、空格回车
5、空格s回车
6、空格s空格回车
7、空格s回车
cat -A 查看空格行空行
[root@zheng ~]# vi kong
a
a
s
s
s
[root@zheng ~]# cat -An kong
1 $
2 a $
3 a$
4 $
5 s$
6 s $
7 s$
过滤纯空行
原本第一行的空没了
[root@zheng ~]# egrep -v '^$' kong |cat -An
1 a $
2 a$
3 $
4 s$
5 s $
6 s$
去除所有带有空格的行
只剩下换行和a换行
[root@zheng ~]# egrep -v ' ' kong |cat -An
1 $
2 a$
去掉开头空格加回车行
少了第四行
[root@zheng ~]# egrep -v '^ +$' kong |cat -An
1 $
2 a $
3 a$
4 s$
5 s $
6 s$
去掉空行或者带开头有空格加回车的行
egrep
少了第一行和第四行
[root@zheng ~]# egrep -v '^$|^ +$' kong |cat -An
1 a $
2 a$
3 s$
4 s $
5 s$
sed -r
少了第一行和第四行
[root@zheng ~]# sed -r '/^$|^ +$/d' kong |cat -An
1 a $
2 a$
3 s$
4 s $
5 s$
^ *$ 高级版本
*表示零次或零次以上
^ *$
*0 次 ^ *$ == ^$
*0次以上 ^ *$ == ^ +$
[root@zheng ~]# egrep -v '^ *$' kong |cat -An
1 a $
2 a$
3 s$
4 s $
5 s$