day18–三剑客命令sed
一、课程回顾
二、sed命令
字符流编辑工具(行编辑工具):按照每行中的字符进行处理操作
全屏编辑工具:vi/vim
1.sed命令作用说明:
1)擅长对行进行操作处理
2)擅长将文件的内容信息进行修改调整/删除
编写脚本:修改文件内容信息时,如修改网络服务中的IP地址:
步骤一:vi ifcfg-eth0
步骤二:重启网络服务
步骤三:检查测试
自动修改网卡地址脚本:
步骤一:修改地址 sed -i ‘s#x#x#g’ ifcfg-eth0
步骤二:重启网络服务 systemctl restart network
步骤三:获取主机地址信息 echo “服务器修改后IP地址: $(hostname -i)" >> /zzx/zzxhostname.txt
2.具体功能作用
1)增
2)删
3)改
4)查(过滤)
3.sed语法
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
命令 参数 条件-处理 处理文件信息
显示出文件中有zzx行的信息
sed -i '/zzx/p' zzx.txt
4.sed命令执行原理
将每一行依次放入内存的模式空间中,进行判断处理,默认输出(-n默认不输出)如遇到匹配的行,则输出。
放在内存中进行操作,不会真正对文件内容进行操作(-i将内存中的信息放到磁盘里,覆盖原文件)
5.sed实践操作
1)查询
可根据文件行号进行查询 或 根据文件内容进行查询:
操作 | 根据文件行号查询 | 根据文件内容查询 |
---|---|---|
显示单行信息 | [root@zzxCentOS7 zzx]# sed -n ‘3p’ person.txt 103,Alex,COO | [root@zzxCentOS7 zzx]# sed -n ‘/zzx/p’ person.txt 101,zzx,CEO |
输出多行信息(连续) | [root@zzxCentOS7 zzx]# sed -n ‘1,3p’ person.txt 101,zzx,CEO 102,zhaoyao,CTO 103,Alex,COO | [root@zzxCentOS7 zzx]# sed -n ‘/zzx/,/Alex/p’ person.txt 101,zzx,CEO 102,zhaoyao,CTO 103,Alex,COO |
输出多行信息(不连续) | [root@zzxCentOS7 zzx]# sed -n ‘1p;3p’ person.txt 101,zzx,CEO 103,Alex,COO | [root@zzxCentOS7 zzx]# sed -n ‘/zzx/p;/Alex/p’ person.txt 101,zzx,CEO 103,Alex,COO 106,zzx,CAO**(sed原理)** |
2)添加
在某行之前添加:
[root@zzxCentOS7 zzx]# sed -i 'i100,zxc,CCC' person.txt 在每行之前都添加
[root@zzxCentOS7 zzx]# sed -i '1i100,zxc,CCC' person.txt 1i表示在文件第1行之前。 -i表示将内存中信息写入磁盘
[root@zzxCentOS7 zzx]# cat person.txt
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
在某行之后添加
[root@zzxCentOS7 zzx]# sed -i '7a107,xxx,XXX' person.txt 7a表示在第7行之后
[root@zzxCentOS7 zzx]# cat person.txt
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
107,xxx,XXX
在文件尾部添加
[root@zzxCentOS7 zzx]# sed '$a108,,,' person.txt $表示在文件尾部
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
107,xxx,XXX
108,,,
添加多行信息
[root@zzxCentOS7 zzx]# sed '$a100\n200' person.txt
100,zxc,CCC
......
107,xxx,XXX
100
200
[root@zzxCentOS7 zzx]# sed -e '/zzx/izzz' -e '/zzx/axxx' person.txt #在有zzx的行前加zzz,行后加xxx
100,zxc,CCC
zzz
101,zzx,CEO
xxx
......
zzz
106,zzx,CAO
xxx
107,xxx,XXX
总结:添加多行内容方法:
命令 | 操作 |
---|---|
vi | |
cat | cat >> xxx.txt <<EOF >>… >>EOF |
echo | echo -e xxx\naaa >> person.txt |
sed | sed -i ‘$axxx\nxxx’ person.txt |
3)删除
[root@zzxCentOS7 zzx]# sed '1d' person.txt 删除第一行
[root@zzxCentOS7 zzx]# sed '1,5d' person.txt 删除第1至5行
[root@zzxCentOS7 zzx]# sed -e '1d' -e '5d' person.txt 删除第一行和第五行
[root@zzxCentOS7 zzx]# sed '1d;5d' person.txt
[root@zzxCentOS7 zzx]# sed '/zzx/d' person.txt 删除含有zzx的行
100,zxc,CCC
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
107,xxx,XXX
练习:取消空行显示
sed '/^$/d' person.txt 删除空行,显示
sed -n '/^$/!p' person.txt -n取消默认显示 !反选
sed -n '/./p' person.txt .显示有内容的行
4)修改
sed 's#XXX#AAA#g' x.txt
#可以替换为/,全部都换
后项引用前项
练习:利用sed命令取出有ip地址的行
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p' #找出包含IP地址的行
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)#\1#g' #将IP地址之前的内容过滤
10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g' #将IP地址之后的内容过滤
10.0.0.200
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g' #简化合并,直接提取net~/24之间的内容
10.0.0.200
[root@zzxCentOS7 zzx]# ip a s eth0 |sed -rn '3s#^.*net (.*)/24.*#\1#gp' 求同存异,3表示第三行,中间操作,p输出
10.0.0.200
补充1:-in
执行 sed -i 命令并生成备份文件
[root@zzxCentOS7 zzx]# sed -i.bak 's#yyy#xxx#g' person.txt # -i.bak 写入磁盘的同时生成备份
[root@zzxCentOS7 zzx]# ls
person.txt person.txt.bak person.txtn zzx1 zzx1.txt zzx.txt zzx.txt.bak
[root@zzxCentOS7 zzx]# diff person.txt.bak person.txt
8c8
< 107,yyy,XXX
---
> 107,xxx,XXX
补充2:-ni
执行sed写入命令时,不能让n和i命令同时出现
[root@zzxCentOS7 zzx]# sed -ni 's#XXX#YYY#g' person.txt ni同时出现,将会把显示的内容写入文件覆盖源文件
[root@zzxCentOS7 zzx]# cat person.txt
[root@zzxCentOS7 zzx]# ???
测试:修改后缀名
批量修改文件的扩展名,将.txt修改为.jpg
[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt" #找出zzx*.txt文件
/zzx/zzx2/zzx01.txt
/zzx/zzx2/zzx02.txt
/zzx/zzx2/zzx03.txt
[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt"|sed -r 's#(.*)txt#mv \1txt \1jpg#g' #将文件名替换为命令
mv /zzx/zzx2/zzx01.txt /zzx/zzx2/zzx01.jpg
mv /zzx/zzx2/zzx02.txt /zzx/zzx2/zzx02.jpg
mv /zzx/zzx2/zzx03.txt /zzx/zzx2/zzx03.jpg
[root@zzxCentOS7 zzx2]# find /zzx/zzx2 -type f -name "zzx*.txt"|sed -r 's#(.*)txt#mv \1txt \1jpg#g'|bash #bash执行
[root@zzxCentOS7 zzx2]# ls #显示
zzx01.jpg zzx02.jpg zzx03.jpg zzx04.jpg zzx05.jpg zzx06.jpg zzx07.jpg zzx08.jpg zzx09.jpg zzx10.jpg
[root@zzxCentOS7 zzx2]# ls zzx*.txt | sed -r 's#(.*)txt#mv & \1jpg#g'|bash #ls命令查找,&表示前一个命令的结果
[root@zzxCentOS7 zzx2]# ls
zzx01.jpg zzx02.jpg zzx03.jpg zzx04.jpg zzx05.jpg zzx06.jpg zzx07.jpg zzx08.jpg zzx09.jpg zzx10.jpg
批量重命名命令:
rename .txt .jpg zzx*.txt
命令 操作前 后 文件
补充3:c
[root@zzxCentOS7 zzx]# sed -i '8c111' person.txt.bak # c 整行替换
[root@zzxCentOS7 zzx]# cat person.txt.bak
100,zxc,CCC
101,zzx,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feiyue,CIO
106,zzx,CAO
111
5)sed补充:sed更多用法
sed -n '/^$/!p' person.txt #指定信息取反
sed '='person.txt #取出文件行号
sed '='person.txt|xargs -n2 同行显示
sed -n '1p;3p;5p' person.txt #执行多个相同指令
6.总结:sed指令信息
p print 输出
i insert 插入信息,在指定信息前插入新的信息
a append 附加信息,在指定信息后附加新的信息
d delete 删除
s substitute 替换
g global 全局
c 整行替换
7.总结:sed参数信息
-n 取消默认输出
-r 识别扩展正则
-i 将内存中的信息写入文件
-e 识别sed命令多个指令