1. sed命令概述
sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
PS: 全屏编辑工具 vi/vim
sed命令作用说明:
1). 擅长对行进行操作处理
2). 擅长将文件的内容信息进行修改调整/删除
具体功能作用:
1) 文件中添加信息的能力 (增)
2) 文件中删除信息的能力 (删)
3) 文件中修改信息的能力 (改)
4) 文件中查询信息的能力 (查)
案例:
编写脚本: 修改文件内容信息时
网络服务中的IP地址进行修改: 50台主机迁移机房--新机房
第一个步骤: vi ifcfg-eth0
第二个步骤: 重启网络服务
第三个步骤: 检查测试
自动修改网卡地址脚本:
第一个步骤: 修改地址
sed -i "s#10.0.0.200#10.0.0.201#g" ifcfg-eth0
第二个步骤: 重启网络服务
systemctl restart network
第三个步骤: 过滤ip a s eth0 网卡地址信息存储到一个文件中 共享存储
初步测试:
改为自动化: 只改变IP中的第三位,其它不改变。只用一个脚本就可以更改其它的主机
[root@xue/home/xuezy]# vim ./test.txt
[root@xue/home/xuezy]# cat ./test.txt
100.2.0.100
22.0.0.11
0.2.30.11
0.0.0.0
[root@xue/home/xuezy]# sed -r "s#(.*\.)(.*\.)0(\..*)#\1\24\3#g" ./test.txt
100.2.4.100
22.0.4.11
0.2.30.11
0.0.4.0
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
2. sed命令的语法信息
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
命令 参数 条件+处理= (指令) 处理文件信息
显示出文件中有oldboy行的信息
sed -n '/oldboy/p' oldboy.txt
3. sed命令执行原理
参见原理图
4. sed命令实践操作
创建测试环境:
cat >person.txt<<EOF
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
a、sed命令查询信息方法
根据文件内容的行号进行查询:
测试1: 显示单行信息
[root@xue/home/xuezy]# sed -n "3p" ./person.txt
103,Alex,COO
测试2: 根据行号信息,输出多行内容(连续)
[root@xue/home/xuezy]# sed -n "1,3p" ./person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
测试3: 根据行号信息,输出多行内容(不连续)
[root@xue/home/xuezy]# sed -n "1p;3p" ./person.txt
101,oldboy,CEO
103,Alex,COO
根据文件内容的信息进行查询:
测试1: 根据内容信息,输出单行内容
#将有oldboy行的信息找出来
[root@xue/home/xuezy]# sed -n "/oldboy/p" ./person.txt
101,oldboy,CEO
测试2: 根据内容信息,输出多行内容(连续)
#将有oldboy到alex行的信息都输出出来
[root@xue/home/xuezy]# sed -n "/oldboy/,/Alex/p" ./person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
测试3: 根据内容信息,输出多行内容(不连续)
#将有oldboy和alex行的信息都输出出来
[root@xue/home/xuezy]# sed -n "/oldboy/p;/Alex/p" ./person.txt
101,oldboy,CEO
103,Alex,COO
b、sed命令添加信息方法
在文件第一行添加信息:
100,oldgirl,UFO
[root@xue/home/xuezy]# sed 'i100,oldgirl,UFO' ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
100,oldgirl,UFO
102,zhaoyao,CTO
100,oldgirl,UFO
103,Alex,COO
100,oldgirl,UFO
104,yy,CFO
100,oldgirl,UFO
105,feixue,CIO
观察结果,因为默认是从上到下匹配数据流,所以每行的上面都添加了
[root@xue/home/xuezy]# sed '1i100,oldgirl,UFO' ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
取消默认输出:就只输出一行
[root@xue/home/xuezy]# sed -n '1i100,oldgirl,UFO' ./person.txt
100,oldgirl,UFO
加入-i才会修改磁盘,否则只是在内存中
[root@xue/home/xuezy]# sed -i '1i100,oldgirl,UFO' ./person.txt
[root@xue/home/xuezy]# cat ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
在文件最后一行添加信息:
[root@xue/home/xuezy]# sed '$a108,oldgirl,UFO' ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
108,oldgirl,UFO
测试:
01. 在第三行后面添加oldboy.txt信息
sed '3aoldboy.txt' person.txt
02. 在第二行前面添加oldboy.txt信息
sed '2ioldboy.txt' person.txt
03. 在有oldboy行的前面添加oldgirl 后面添加olddog信息
sed -e '/oldboy/ioldgirl' -e '/oldboy/aolddog' person.txt
[root@oldboyedu ~]# sed -e '/oldboy/ioldgirl' -e '/oldboy/aolddog' person.txt
100,oldgirl,UFO
oldgirl
101,oldboy,CEO
olddog
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
oldgirl
106,oldboy,CIO
olddog
添加多行信息:
[root@xue/home/xuezy]# sed '$a100\n200' ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
100
200
企业中编写配置文件:
IPaddress=10.10.10.1
mask=255.255.255.0
gateway=10.10.10.254
sed '$aIPaddress=10.10.10.1\nmask=255.255.255.0\ngateway=10.10.10.254' 文件名称
文件中添加内容方法:
01. vim/vi
02. cat >>xxx<EOF .. EOF
03. echo -e "xxx\nxxx"
04. sed 'na/i xxxx\nxxxx\nsxxxx'
c 、sed命令删除信息方法
练习:
01. 删除单行信息
[root@oldboyedu ~]# #删除文件中第三行信息
[root@xue/home/xuezy]# sed '3d' ./person.txt
100,oldgirl,UFO
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
02. 删除多行信息
[root@oldboyedu ~]# #删除文件中第二行到第六行内容
[root@xue/home/xuezy]# sed '2,4d' ./person.txt
100,oldgirl,UFO
104,yy,CFO
105,feixue,CIO
测试:
01. 删除有oldboy信息的行
[root@xue/home/xuezy]# sed '/oldboy/d' ./person.txt
100,oldgirl,UFO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
02. 删除第三行和第六行
[root@oldboyedu ~]# #删除文件中第二行到第六行内容
[root@oldboyedu ~]# sed '2,6d' person.txt
100,oldgirl,UFO
106,oldboy,CIO
[root@oldboyedu ~]# sed '3d;6d' person.txt
100,oldgirl,UFO
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
106,oldboy,CIO
问题: 如何利用sed命令取消空行显示
[root@oldboyedu ~]# sed -n '/./p' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@oldboyedu ~]# sed '/^$/d' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@oldboyedu ~]# sed -n '/^$/!p' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
d 、sed命令修改信息方法
sed 's#原有内容#修改后内容#g' 文件信息
[root@xue/home/xuezy]# sed 's##oldgirl#old#g' ./person.txt
sed: -e expression #1, char 12: unknown option to `s'
[root@xue/home/xuezy]# sed 's#\#oldgirl#old#g' ./person.txt
100,old,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@xue/home/xuezy]# sed 's/#oldgirl/old/g' ./person.txt
100,old,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
sed 's#()#\n#g' 文件信息 后项引用前项进行替换修改
利用sed命令取出IP地址信息:
第一个历程: 取出有IP地址的行
[root@xue/home/xuezy]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b7:4e:3c brd ff:ff:ff:ff:ff:ff
inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::f64e:d691:b73a:6f2a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@xue/home/xuezy]# ip a s eth0 | sed -n '3p'
inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
第二个历程: 取出IP地址
[root@xue/home/xuezy]# ip a s eth0 | sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'
192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
[root@xue/home/xuezy]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
192.168.144.20
sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g' 进行整合
[root@xue/home/xuezy]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'
192.168.144.20
sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g' 进行整合
sed -n '3 p'
sed -r 's#^.*net (.*)/24.*#\1#g'
sed -rn '3s#^.*net (.*)/24.*#\1#gp'
最终取IP地址方法
[root@xue/home/xuezy]# ip a s eth0|sed -nr '3s#^.*net (.*)/24.*#\1#gp'
192.168.144.20
补充01: 修改文件内容直接进行自动备份
[root@xue/home/xuezy]# sed -i.bak 's#oldboy#old#g' ./person.txt
[root@xue/home/xuezy]# cat ./person.txt
100,#oldgirl,UFO
101,old,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@xue/home/xuezy]# cat ./person.txt.bak
100,#oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@xue/home/xuezy]# ll person.txt.bak
-rw-r--r--. 1 root root 87 Apr 7 10:04 person.txt.bak
补充02: 在真实替换文件内容时候,一定不能让n和i参数同时出现
[root@oldboyedu ~]# sed -ni 's#Alex#aaaa#gp' person.txt
103,aaaa,COO
[root@oldboyedu ~]# cat person.txt
103,aaaa,COO
说明: ni和参数同时使用,会将文件内容进行清空
测验替换功能:
创建测试环境:
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy01.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy02.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy03.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy04.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy05.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy06.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy07.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy08.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy09.txt
-rw-r--r--. 1 root root 0 Oct 10 02:10 oldboy10.txt
批量修改文件的扩展名称 将oldboyxx.txt扩展名修改为oldboyxx.jpg
[root@xue/home/xuezy]# ls oldboy*.txt
oldboy01.txt oldboy03.txt oldboy05.txt oldboy07.txt oldboy09.txt
oldboy02.txt oldboy04.txt oldboy06.txt oldboy08.txt oldboy10.txt
[root@xue/home/xuezy]# ls oldboy*.txt | sed -r 's#(.*)txt#mv & \1jpg#g'
mv oldboy01.txt oldboy01.jpg
mv oldboy02.txt oldboy02.jpg
mv oldboy03.txt oldboy03.jpg
mv oldboy04.txt oldboy04.jpg
mv oldboy05.txt oldboy05.jpg
mv oldboy06.txt oldboy06.jpg
mv oldboy07.txt oldboy07.jpg
mv oldboy08.txt oldboy08.jpg
mv oldboy09.txt oldboy09.jpg
mv oldboy10.txt oldboy10.jpg
执行命令:
[root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'|bash
批量重命名专业命令: rename
rename .txt .jpg oldboy*.txt
命令 文件名称需要修改的部分信息 修改成什么信息 将什么样的文件进行修改
注意::::[root@xue/home/xuezy]# cat ./person.txt | sed -i 's#CEO#PDD#g' 修改内存中的,不会改变磁盘中的内容
[root@xue/home/xuezy]# cat ./person.txt
100,#oldgirl,UFO
101,old,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@xue/home/xuezy]# cat ./person.txt | sed -i 's#CEO#PDD#g'
sed: no input files
[root@xue/home/xuezy]# cat ./person.txt
100,#oldgirl,UFO
101,old,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@xue/home/xuezy]# sed -i 's#CEO#PDD#g' ./person.txt
[root@xue/home/xuezy]# cat ./person.txt
100,#oldgirl,UFO
101,old,PDD
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
补充1:
[root@xue/home/xuezy]# sed '=' ./person.txt
1
100,#oldgirl,UFO
2
101,old,PDD
3
102,zhaoyao,CTO
4
103,Alex,COO
5
104,yy,CFO
6
105,feixue,CIO
[root@xue/home/xuezy]#
[root@xue/home/xuezy]# sed '=' ./person.txt | xargs -n2
1 100,#oldgirl,UFO
2 101,old,PDD
3 102,zhaoyao,CTO
4 103,Alex,COO
5 104,yy,CFO
6 105,feixue,CIO
补充2: 替换修改指定的一整行信息
[root@oldboyedu ~]# sed '2coldboyedu-sz-01' person.txt
103,aaaa,CEO
oldboyedu-sz-01
总结: sed命令的指令信息
p print 输出信息
i insert 插入信息,在指定信息前面插入新的信息
a append 附加信息,在指定信息后面附加新的信息
d delete 删除指定信息
s substitute 替换信息 s###g(全局替换)
c 替换修改指定的一整行信息
总结: sed命令的参数信息
-n 取消默认输出
-r 识别扩展正则
-i 真实编辑文件(将内存中的信息覆盖到磁盘中)
-e 识别sed命令多个操作指令
作业:
01. 总结正则符号
02. 总结sed命令
03. 总结find tar date