1.概述
- 核心功能:取行,过滤,替换修改文件内容
- 难点:后向引用(截取).
- sed stream editor流编辑器.
2.格式
命令 | 选项 | 详细格式 | 参数 |
---|---|---|---|
sed | 选项 | '条件动作' | 文件 |
'找谁干啥' |
找谁:条件,匹配哪一行,哪些行.
干啥:动作,增删改查.
#显示文件的第3行
sed -n '3p' /etc/passwd
选项 | 说明 |
---|---|
-n | 取消默认输出 |
-r | sed支持扩展正则 |
-i | 修改文件内容,这个选项放在最后. |
-i.bak | 先进行备份,然后修改文件内容.这个选项放在最后. |
3.如何运行
4.sed增删改查之查找
一种是类似于grep模糊查找.
一种是精确查找,行号.
- 类似于grep命令的过滤,比grep强在于可以指定行号.
- 类似于grep命令的功能,模糊查询(通过正则).
案例01: 取出文件的第3行 ⭐⭐⭐⭐⭐
-n表示取消默认输出,sed处理文件的时候会默认的输出每一行内容.
sed -n '3p' /etc/passwd
案例02: 取出/etc/passwd的第2行到第5行⭐⭐⭐⭐⭐
sed -n '2,5p' /etc/passwd
案例03: 过滤出/etc/passwd中包含root的行 ⭐⭐⭐⭐⭐
[root@myvps ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@myvps ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@myvps ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
⚠ 注意
sed进行过滤的时候需要使用 并且里面支持基础正则
如果需要使用扩展正则需要使用sed -r选项
案例04: 获取范围内的日志 ⭐⭐⭐⭐⭐
cat >/oldboy/sed.txt<<EOF
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
EOF
[root@myvps ~]# sed -n '/102/,/105/p' /oldboy/sed.txt
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
[root@myvps ~]# sed -n '/102/,/105/p' /oldboy/sed.txt
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
[root@myvps ~]# #sed -n '/10:00:00/,/11:00:00/p' /oldboy/sed.txt
4.1 sed命令过滤/查找功能小结
- 核心掌握:
- 根据行号查找,模糊查找,模糊表示范围(日志)
- 注意这里提到的指定行号,方式都表示条件(找谁),除了给p(查找)用,还可以给改,增加,删除.
- 过滤的时候与grep类似支持正则表达式,sed -r支持扩展正则.
4.2 只显示第3行和第5行
sed -n '1p;5p' /etc/passwd
4.3 表示有规律的查找-了解
[root@myvps oldboy]# seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@myvps oldboy]# seq 10 |sed -n '2~2p'
2
4
6
8
10
4.4 sed增删查改查之修改
- sed的修改叫做替换.
(案例05): 把sed.txt文件中lidao替换为oldboy
sed命令的替换格式说明:
sed 's#找谁#替换成什么#g' sed.txt
sed 's###g' sed.txt
推荐使用: ### , /// , @@@
s substitute 替换 sub
g global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个匹配的内容
- 修改文件内容
sed命令替换的时候 s###g
也可以写为 s@@@g s///g
- 修改文件内容之前进行备份,然后修改文件内容
sed -i.bak 's#bigbao#oldbao#' /oldboy/sed.txt
-i后面可以加上一些额外的内容 -i.bak 表示先对sed.txt进行备份 sed.txt.bak
然后对文件内容进行替换
一般用于替换某一个文件,如果是多个文件就打包压缩进行备份即可[root@myvps ~]# ll /oldboy/sed.*
-rw-r--r-- 1 root root 90 3月 3 13:44 /oldboy/sed.txt
-rw-r--r-- 1 root root 90 3月 3 13:37 /oldboy/sed.txt.bak
4.5 增删改查之替换-进阶
(1)后向引用格式
应用说明:
后向引用或反向引用: 适用于sed命令处理/提取一行中的某一部分.sed命令配合正则实现取列.(类似于awk取列)
sed命令中用于处理列的方式.
使用格式:
使用替换的形式 s###g
前2个井号之间通过正则与(),对数据进行分组.
后面2个井号之间通过\数字,去调用前面分组的内容.
整体是后面调用前面分组的内容,称之为反向引用/后向引用.
应用场景: 某一行中对部分数据进行加工与处理,提取某一部分数据
- 例子
输出12345678,通过sed加工变成1<234567>8
[root@myvps ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\1#g'
1
[root@myvps ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\2#g'
234567
[root@myvps ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\3#g'
8
[root@myvps ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#<\2>#g'
<234567>
[root@myvps ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
1<234567>8
案例01: 调换/etc/passwd第1列和最后一列内容
cp /etc/passwd .
- 匹配第1组
- 匹配第2组
- 匹配第3组
- 输出最后结果:
sed -r 's#^(.*)(:x.*:)(.*$)#\3\2\1#g' passwd
^([a-zA-Z0-9_-]+)(:.*:)(/.*)$
案例02: 取出网卡ip地址
ip a s eth0取出第3行里面的ip地址
方法01
[root@myvps ~]# ip a s eth0 |sed -n '3p' | sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'
10.0.0.200方法02 进阶sed -n '3p'+ sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'---------------------------------------= sed -nr '3 s#^.*et ([0-9.]+)/.*$#\1#g p'方法03 awk [root@myvps ~]# ip a s eth0 | sed -n '3p' |awk '{print $2}' |sed 's#/24##g'
10.0.0.200
方法04 awk[root@myvps ~]# ip a s eth0 | sed -n '3p' |awk -F "[ /]+" '{print $3}'
10.0.0.200
方法05-06 awk
ip a s eth0 | sed -n '3p' |awk -F "[ /]+" '{print$3}'[root@myvps ~]# ip a s eth0 | awk -F "[ /]+" 'NR3{print $3}'
10.0.0.200方法07
hostname -I
目前核心掌握第1种,awk后掌握awk方法
案例03: 取出stat /etc/hosts中的0644或644
[root@myvps ~]# stat /etc/hosts |sed -n '4p' | sed -r 's#^.*\(([0-9]+)/.*$#\1#g'
4.6 增删改查之删除
- d delete 删除sed命令删除功能按照 行 为单位进行.
- 如果仅仅删除某一行的一些字符推荐使用's#[a-z]##g'
# sed '3d' sed.txt
101,oldboy,CEO
102,oldbao,CTO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
- 排除/删除文件中的空行和带注释的行
egrep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config
awk '! /^$|#/' /etc/ssh/sshd_configsed -nr '/^$|#/!p' /etc/ssh/sshd_config
4.7 增删改查之增加
- cai
- a append 在指定行后面追加内容
- i insert 在指定行上面插入一行
- c replace 替换指定行的内容
[root@myvps oldboy]# sed '3a lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
103,李导996,COO
lidao996
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# cat sed.txt
101,oldboy,CEO
102,oldbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# sed '3i lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
lidao996
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# sed '3c lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
lidao996
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO