🍺sed
Linux三剑客sed:
sed是 Stream Editor (字符流编辑器) 的缩写,简称流编辑器
sed是操作、过滤和转换文本内容的强大工具。
常用功能包括结合正则表达式对文件实现快速的增删改查,其中查询功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。
sed语法:
sed [选项] [sed内置命令字符] [输入文件]
参数选项 | 解释 |
---|---|
-n | 取消默认sed的输出,常与sed内置命令p一起用 |
-i | 直接将修改结果写入文件,不同-i,sed修改的是内存数据 |
-e | 多次编辑,不需要管道符了 |
-r | 支持正则扩展 |
sed的 内置命令字符 用于对文件进行不同的操作功能,如对文件的增删改查
sed常用的内置命令字符:
sed的内置命令字符 | 解释 |
---|---|
a | append,对文本追加,在指定行后面添加一行/多行文本 |
d | Delete,删除匹配行 |
i | insert,表示插入文本,在指定行前添加一行/多行文本 |
p | Print,打印匹配行的内容,通常p与-n一起用 |
s/正则/替代内容/g | 匹配正则内容,然后替换内容(支持正则),结尾**g(Global)**代表全局匹配 |
sed匹配范围
范围 | 解释 |
---|---|
空地址(空格) | 全文处理 |
单地址 | 指定文件某一行 |
/pattern | 被匹配到的每一行 |
范围区间 | 10,20 十到二十行,10,+5第10行向下5行, /pattern1/,/pattern2/ |
步长 | 1~2 ,表示1、3、5、7、9 行,2~2 两个步长,表示2、4、6、8、10 ,偶数行 |
sed案例
准备测试文件
cat > luffycity.txt <<-EOF
My name is chaoge.
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.
EOF
- 1、输出文件第2、3行的内容
# sed -n:取消默认输出,sed默认会将匹配规则的和不匹配规则的文本输出,因此需要使用-n参数取消默认输出
[root@kvm01 ~]# sed -n '2,3p' luffycity.txt
I teach Linux.
I like play computer game.
# 显示前两行并向下输出三行
[root@kvm01 ~]# sed -n "2,+3p" luffycity.txt
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.
- 2、过滤出含有Linux的字符串行
# sed /Linux/p: "/p"字符表示打印需要查找的字符
[root@kvm01 ~]# sed -n "/Linux/p" luffycity.txt
I teach Linux.
- 3、删除含有game的行然后输出
# 这里只是删除了包含"game"字段的行输出到屏幕,并没有修改文件的内容
[root@kvm01 ~]# sed "/game/d" luffycity.txt
My name is chaoge.
I teach Linux.
My qq is 12345678.
My website is http://pythonav.cn.
[root@kvm01 ~]# cat luffycity.txt
My name is chaoge.
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.
# 添加上-i参数,修改luffycity.txt文件,删除里面带game的行
[root@kvm01 ~]# sed -i "/game/d" luffycity.txt && cat luffycity.txt
My name is chaoge.
I teach Linux.
My qq is 12345678.
My website is http://pythonav.cn.
删除第五行到结尾:
[root@kvm01 ~]# cat -n luffycity.txt
1 My name is chaoge.
2 I teach Linux.
3 My qq is 12345678.
4 My website is http://pythonav.cn.
5 My website is http://pythonav.cn.
6 My website is http://pythonav.cn.
7 My website is http://pythonav.cn.
8 My website is http://pythonav.cn.
9 My website is http://pythonav.cn.
10 My website is http://pythonav.cn.
[root@kvm01 ~]# sed -i '5,$d' luffycity.txt
[root@kvm01 ~]# cat -n luffycity.txt
1 My name is chaoge.
2 I teach Linux.
3 My qq is 12345678.
4 My website is http://pythonav.cn.
- 4、将luffycity.txt文档中的My替换成His
# 命令语法: 双引号或者单引号作为字符串内容都可以
$ sed "s/你想查找的内容/你想替换成的内容/g"
$ sed "s#你想查找的内容#你想替换成的内容#g"
$ sed "s@你想查找的内容@你想替换成的内容@g"
[root@kvm01 ~]# sed -i 's/My/His/g' luffycity.txt
[root@kvm01 ~]# cat -n luffycity.txt
1 His name is chaoge.
2 I teach Linux.
3 His qq is 12345678.
4 His website is http://pythonav.cn.
- 5、替换所有的My为His,同时换掉QQ号为88888888
# 替换成原来的文件
[root@kvm01 ~]# sed -i 's/His/My/g' luffycity.txt | cat -n luffycity.txt
1 My name is chaoge.
2 I teach Linux.
3 My qq is 12345678.
4 My website is http://pythonav.cn.
# sed -e:多次替换编辑文件,将'My'替换成'His','12345678'替换成'88888888'输出到屏幕
[root@kvm01 ~]# sed -e 's/My/His/g' -e 's/12345678/88888888/g' luffycity.txt
His name is chaoge.
I teach Linux.
His qq is 88888888.
His website is http://pythonav.cn.
# sed -e -i:多次替换编辑文件并修改其中的内容
[root@kvm01 ~]# sed -e 's/My/His/g' -e 's/12345678/88888888/g' -i luffycity.txt && cat luffycity.txt
His name is chaoge.
I teach Linux.
His qq is 88888888.
His website is http://pythonav.cn.
- 6、在文件第二行追加内容a字符功能,写入到文件,还需要添加-i
# 将"My linux is good",输出到luffycity.txt这个文件的第三行输出到屏幕(不加-i参数默认不修改文件内容)
# 字符a表示在第二行后面添加
[root@kvm01 ~]# sed "2a My linux is good." luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
His qq is 88888888.
His website is http://pythonav.cn.
# -i: 将"My linux is good",输出到luffycity.txt这个文件的第三行(此处修改luffycity.txt这份文件)
[root@kvm01 ~]# sed -i "2a My linux is good." luffycity.txt && cat luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
His qq is 88888888.
His website is http://pythonav.cn.
# 在第四行前面添加一行内容
[root@kvm01 ~]# sed "4i My telphone is 00000000" luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.
# -i: 将"My telphone is 00000000",输出到luffycity.txt这个文件的第四行前添加(此处修改luffycity.txt这份文件)
[root@kvm01 ~]# sed -i "4i My telphone is 00000000" luffycity.txt && cat luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.
# 通过使用\n转义符,将两句话分别换行添加到luffycity.txt这份文件中输出屏幕
[root@kvm01 ~]# sed '3a I like linux.\nI like linux very much.' luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
I like linux.
I like linux very much.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.
# 将输出的结果写入到文件中
[root@kvm01 ~]# sed -i '3a I like linux.\nI like linux very much.' luffycity.txt && cat luffycity.txt
His name is chaoge.
I teach Linux.
My linux is good.
I like linux.
I like linux very much.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.
在每行下面插入新内容
[root@kvm01 ~]# sed 'a -------------' luffycity.txt
His name is chaoge.
-------------
I teach Linux.
-------------
My linux is good.
-------------
I like linux.
-------------
I like linux very much.
-------------
My telphone is 00000000
-------------
His qq is 88888888.
-------------
His website is http://pythonav.cn.
-------------
(5)、sed配合正则表达式
上一章节用 grep -E 扩展正则表达式,这一节使用sed配合正则表达式使用
- 1、使用ifconfig命令获取当前Linux系统的IP地址并使用sed提取出来
# 方法一: 使用sed筛选出第二行的内容,配合awk进行查找第二段
[root@kvm01 ~]# ifconfig | sed '2p' -n
inet 192.168.39.2 netmask 255.255.255.0 broadcast 192.168.39.255
[root@kvm01 ~]# ifconfig | sed '2p' -n | awk '{print$2}'
192.168.39.2
# 方法二:
# 查看ens3网卡的信息,使用sed过滤第二行输出,然后用sed匹配inet前面的所有字段替换成空格,同理net后面所有字段也替换成空格
[root@kvm01 ~]# ifconfig ens3 | sed "2p" -n | sed 's/^.*inet//' | sed 's/net.*$//'
192.168.39.2
# 方法三: -e参数多次编辑,在第二行进行查找inet前的所有字符并替换成空格输出屏幕
[root@kvm01 ~]# ifconfig ens3 | sed -e '2s/^.*inet//p' -n
192.168.39.2 netmask 255.255.255.0 broadcast 192.168.39.255
# 在前面替换完后再对net后面的结果进行查找替换成空格输出,不输出第一次sed处理后的语句
[root@kvm01 ~]# ifconfig ens3 | sed -e '2s/^.*inet//' -n -e "2s/net.*$//p" -n
192.168.39.2