三剑客sed
sed命令:字符流编辑工具(行编辑)=按照每行中的字符进行处理操作
ps:全屏编辑工具vi/vim
sed命令作用说明:
1) 擅长对行进行操作处理
2) 擅长将文件的内容信息进行修改调整
编写脚本:修改文件内容信息时
网络服务中的IP地址进行修改:50台主机迁移机房
第一个步骤:vim /etc/sysconfig/network-scripts/ifcfg-eth0
第二个步骤: 重启网络服务
第三个步骤: 检查测试
自动修改网卡地址脚本:
第一个步骤:修改地址
sed -i "s#xxx#xxx#g" etc/sysconfig/network-scripts/ifcfg-eth0
第二个步骤:重启网卡服务
systemctl restart network
第三个步骤:过滤ip a s eth0 网卡地址信息存储到一个文件中 共享存储
echo "服务器修改后的ip地址: $(hostname -I)" >> /tmp/hggboy.txt
具体功能作用:
1)文件中添加信息的能力(增)
2)文件中删除信息的能力(删)
3)文件中查询信息的能力(查)
4)文件中修改信息的能力(改)
2. sed命令的执行原理
1) 语法信息:
sed 参数 条件+处理=指令 处理的文件信息
01.参数:
-n --文件默认存在的原内容不输出
-i --将还在内存中的信息存入文件(磁盘)
-r --识别扩展正则符(用于替换修改)
-e --识别sed命令多个操作
补充: i与u结合使用,会覆盖原来的文件信息
02.指令:
p print 输出信息
i insert 插入信息,在指定信息前面插入新的信息
a append 附加信息,在指定信息后面附加新的信息
d delete 删除指定信息
s substitute 替换信息(s###g)
c 替换修改指定的一整行信息
sed '2c替换的信息' 文件信息
2) sed命令实践操作
创建测试环境
[root@HGG ~]# cat >>person.txt<<EOF
> 101.hggboy,CEO
> 102.zhaoyao,CTO
> 103.Alex,COO
> 104.yy,CFO
> 105.feixue,CIO
> EOG
> EOF
3) sed命令查询信息方法
01. 根据文件内容的行号进行查找
测试1:根据行号输出单行内容
[root@HGG ~]# sed -n '3p' person.txt
103.Alex,COO
测试2:根据行号,输出多行内容(连续)
[root@HGG ~]# sed -n '1,3p' person.txt
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
测试3:根据行号,输出多行信息(不连续)
[root@HGG ~]# sed -n '1p;3p' person.txt
101.hggboy,CEO
103.Alex,COO
02. 根据内容信息进行查询
测试1:根据内容信息,输出单行内容
#将所有hggboy行的信息找出来
[root@HGG ~]# sed -n '/hggboy/p' person.txt
101.hggboy,CEO
测试2:根据内容信息,输出多行内容(连续)
#将有hggboy到Alex行的内容信息输出
[root@HGG ~]# sed -n '/hggboy/,/Alex/p' person.txt
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
测试3:根据内容信息,输出多行信息(不连续)
#将所有hggboy和Alex行的信息都输出
[root@HGG ~]# sed -n '/hggboy/p;/Alex/p' person.txt
101.hggboy,CEO
103.Alex,COO
4) sed命令添加信息(i,a,\n)
测试1: 在文件的第一行添加:100.hgggirl,UFO
[root@HGG ~]# sed '1i100.hgggirl,UFO' person.txt --只通过内存输出在屏幕
100.hgggirl,UFO
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
[root@HGG ~]# sed -i '1i100.hgggirl,UFO' person.txt --在内存写入文件输出
[root@HGG ~]# cat person.txt
100.hgggirl,UFO
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
测试2: 在文件的最后一行添加:106.hgggirl,UFO
[root@HGG ~]# sed '6a106.hgggirl,UFO' person.txt
100.hgggirl,UFO
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
106.hgggirl,UFO
测试3: 在有hggboy的前面添加hgggirl , 在后面添加hggdog (-e)
[root@HGG ~]# sed -e '/hggboy/ihgggirl' -e '/hggboy/ahggdog' person.txt
100.hgggirl,UFO
hgggirl
101.hggboy,CEO
hggdog
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
测试4: 添加多行信息,在最后一行添加100,101,102 (/n)
[root@HGG ~]# sed '$a100\n101\n102' person.txt
100.hgggirl,UFO
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
100
101
102
5) sed命令删除信息
01.删除单行信息.删除第一行内容
[root@HGG ~]# sed '1d' person.txt
101.hggboy,CEO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
02.删除多行信息,删除1-3行neir
[root@HGG ~]# sed '1,3d' person.txt
103.Alex,COO
104.yy,CFO
105.feixue,CIO
03.删除有hggboy信息的行
[root@HGG ~]# sed '/hggboy/d' person.txt
100.hgggirl,UFO
102.zhaoyao,CTO
103.Alex,COO
104.yy,CFO
105.feixue,CIO
04.删除第三行与第六行信息
方法一:
[root@HGG ~]# sed -e '3d' -e '6d' person.txt
100.hgggirl,UFO
101.hggboy,CEO
103.Alex,COO
104.yy,CFO
方法二:
[root@HGG ~]# sed '3d;6d' person.txt
100.hgggirl,UFO
101.hggboy,CEO
103.Alex,COO
104.yy,CFO
补充:
如何用sed命令取消/删除空行显示
sed -En '/^$/!p' person.txt
sed '/^$/d' person.txt
6) sed命令修改(替换)信息
sed 's#原来信息#要改的信息#g' 文件信息
ps: 若要替换修改的信息有#,用/代替
01.后项引用前项
sed 's#()#/n#g' 文件信息 --后项引用前项
利用sed命令取出ip地址信息
a.第一个历程:取出有ip地址的行
ip a s eth0|sed -n '3p'
b.第二个历程:取出ip
ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
简化一:
ip a s eth0|sed -n '3p'|sed -r 's#^.*net(.*)/24.*#\1#g'
最终简化:
ip a s eth0|sed -rn '3s#^.*net(.*)/24.*#\1#gp'
补充:
01.修改文件直接自动备份
sed -i.bak 's#hggboy#hggboss#g' person.txt
02.批量修改文件的扩展名称
将hggboy.txt扩展名修改为hggboy.jpg
ls /hgg/hggboy*txt|sed -r 's#(.*)txt#mv & \1jpg#g'|bash
03.批量重姓名专用命令:rename
rename 文件名称需要修改的部分 修改成什么样 将什么样的文件进行修改
rename .jpg .txt hggboy*.jpg
[root@HGG hgg]# ls
hggboy01.jpg hggboy03.jpg hggboy05.jpg hggboy07.jpg hggboy09.jpg
hggboy02.jpg hggboy04.jpg hggboy06.jpg hggboy08.jpg hggboy10.jpg
[root@HGG hgg]# rename .jpg .txt hggboy*.jpg
[root@HGG hgg]# ls
hggboy01.txt hggboy03.txt hggboy05.txt hggboy07.txt hggboy09.txt
hggboy02.txt hggboy04.txt hggboy06.txt hggboy08.txt hggboy10.txt