linux老男孩 基础部分章节08-----三剑客-sed

  

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    
    
    
    
    
    
    
    
  
  
  
       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值