zoukankan      html  css  js  c++  java
  • Linux:三剑客之 sed

    sed命令概述说明:

    sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
    PS: 全屏编辑工具 vi/vim
    

    sed命令作用说明:

    1). 擅长对行进行操作处理
    2). 擅长将文件的内容信息进行修改调整/删除
    

    编写脚本: 修改文件内容信息时

    网络服务中的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 网卡地址信息存储到一个文件中 共享存储

    具体功能作用:

    1) 文件中添加信息的能力 (增) ok
    2) 文件中删除信息的能力 (删) ok
    3) 文件中修改信息的能力 (改)
    4) 文件中查询信息的能力 (查) OK
    

    sed命令的语法信息

    sed [OPTION]... {script-only-if-no-other-script} [input-file]...
    命令 参数        条件+处理= (指令)              处理文件信息
    
    显示出文件中有oldboy行的信息
    sed  -n          '/oldboy/p'                      oldboy.txt	
    

    sed命令执行原理

    参见原理图
    

    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@oldboyedu ~]# sed -n '3p' person.txt 
    103,Alex,COO
    
    测试2: 根据行号信息,输出多行内容(连续)
    [root@oldboyedu ~]# sed -n '1,3p' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    
    测试3: 根据行号信息,输出多行内容(不连续)
    [root@oldboyedu ~]# sed -n '1p;3p' person.txt 
    101,oldboy,CEO
    103,Alex,COO
    
    根据文件内容的信息进行查询:
    测试1: 根据内容信息,输出单行内容
    #将有oldboy行的信息找出来
    [root@oldboyedu ~]# sed -n '/oldboy/p' person.txt 
    101,oldboy,CEO
    
    测试2: 根据内容信息,输出多行内容(连续)
    #将有oldboy到alex行的信息都输出出来
    [root@oldboyedu ~]# sed -n '/oldboy/,/Alex/p' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    
    测试3: 根据内容信息,输出多行内容(不连续)
    #将有oldboy和alex行的信息都输出出来
    [root@oldboyedu ~]# sed -n '/oldboy/p;/Alex/p' person.txt 
    101,oldboy,CEO
    103,Alex,COO
    106,oldboy,CIO
    
    b sed命令添加信息方法
    在文件第一行添加信息:
    100,oldgirl,UFO
    [root@oldboyedu ~]# sed  '1i100,oldgirl,UFO' 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  '$a108,oldgirl,UFO' person.txt
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,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
    

    ####### sed '$a100 101' person.txt 添加多行信息
    企业中编写配置文件:
    IPaddress=10.10.10.1
    mask=255.255.255.0
    gateway=10.10.10.254

    sed '$aIPaddress=10.10.10.1
    mask=255.255.255.0
    gateway=10.10.10.254' 文件名称
    
    c sed命令删除信息方法
    练习:
    
    01. 删除单行信息
    [root@oldboyedu ~]# #删除文件中第三行信息
    [root@oldboyedu ~]# sed '3d' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
    

    ####### 02. 删除多行信息
    [root@oldboyedu ~]# #删除文件中第二行到第六行内容
    [root@oldboyedu ~]# sed '2,6d' person.txt
    100,oldgirl,UFO
    106,oldboy,CIO

    测试:
    01. 删除有oldboy信息的行
    sed '/oldboy/d' person.txt 
    
    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@oldboyedu ~]# sed 's##oldgirl#old#g' person.txt 
    sed: -e expression #1, char 12: unknown option to `s'
    [root@oldboyedu ~]# 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
    106,oldboy,CIO
    
    sed 's#()#
    #g' 文件信息 后项引用前项进行替换修改
    

    利用sed命令取出IP地址信息:

    第一个历程: 取出有IP地址的行
    [root@oldboyedu ~]# ip a s eth0|sed -n '3p'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    
    第二个历程: 取出IP地址
    [root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#1#g'
    10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#1#g'|sed -r 's#(.*)/24.*#1#g'
    10.0.0.200
    
    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'
    
    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@oldboyedu ~]# ip a s eth0|sed -rn '3s#^.*net (.*)/24.*#1#gp'
    10.0.0.200
    

    补充01: 修改文件内容直接进行自动备份

    [root@oldboyedu ~]# sed -i.bak  's#oldboy#oldold#g' person.txt 
    [root@oldboyedu ~]# ll person.txt.bak 
    -rw-r--r--. 1 root root 104 Oct 10 11:40 person.txt.bak
    [root@oldboyedu ~]# cat person.txt.bak 
    100,#oldgirl,UFO
    
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
    

    补充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@oldboyedu oldboy]# 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
    mv oldboy.txt oldboy.jpg
    [root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & 1jpg#g'|bash
    & 符号指代前项的内容,也就是(.*)的内容
    
    批量重命名专业命令: rename
    rename  .txt                           .jpg                 oldboy*.txt
    命令    文件名称需要修改的部分信息    修改成什么信息      将什么样的文件进行修改
    
    [root@oldboyedu ~]# cat person.txt|sed -i 's#COO#CEO#g'
    sed: no input files
    [root@oldboyedu ~]# sed -i 's#COO#CEO#g' person.txt
    
    文件中添加内容方法:
    01. vim/vi 
    02. cat >>xxx<EOF .. EOF 
    03. echo -e "xxx
    xxx"
    04. sed 'na/i xxxx
    xxxx
    sxxxx'
    

    总结: sed命令的指令信息

    p  print        输出信息
    i  insert       插入信息,在指定信息前面插入新的信息
    a  append       附加信息,在指定信息后面附加新的信息
    d  delete       删除指定信息
    s  substitute   替换信息 s###g(全局替换)
    c               替换修改指定的一整行信息
    [root@oldboyedu ~]# sed '2coldboyedu-sz-01' person.txt
    103,aaaa,CEO
    oldboyedu-sz-01
    
    总结: sed命令的参数信息
    -n  取消默认输出
    -r  识别扩展正则
    -i  真实编辑文件(将内存中的信息覆盖到磁盘中)	
    -e  识别sed命令多个操作指令
  • 相关阅读:
    进程通信之信号通信
    分数化小数
    台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
    网络子系统53_ip协议分片重组_内存阈值
    Centos 6.3 Realtek Audio Driver Compile
    I.MX6 PHY fixup 调用流程 hacking
    I.MX6 AR8031 寄存器操作
    I.MX6 ethtool 移植
    I.MX6 U-Boot ping网络
    Android tcpdump 使用
  • 原文地址:https://www.cnblogs.com/moox/p/12193087.html
Copyright © 2011-2022 走看看