zoukankan      html  css  js  c++  java
  • Linux三剑客-SED

    1、Sed是什么

    Sed:字符流编辑器,Stream Editor

    2、Sed功能与版本

    处理日志文件,日志,配置文件等

    增加、删除、修改、查询

    sed --version 可以通过man sed 来检验系统中有没有安装sed

    [root@luffy-001 ~]# sed --version
    GNU sed version 4.2.1
    Copyright (C) 2009 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
    to the extent permitted by law.
    
    GNU sed home page: <http://www.gnu.org/software/sed/>.
    General help using GNU software: <http://www.gnu.org/gethelp/>.
    E-mail bug reports to: <bug-gnu-utils@gnu.org>.
    Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

    3、语法格式

    sed  [选项]  [sed指令]  [输入文件]

    sed   -i.bak ‘s#oldboy#oldgirl#g’  oldboy.txt

    -i  --sed命令的参数

    s  --sed命令/指令

    g  ------小尾巴/修饰

    4、命令执行流程

    模式空间:sed从文件读取一行文本后存入缓存区(这个缓存区在内存中)

    5、常用功能

    查询

    创建测试文件

    cat>person.txt<<EOF
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    EOF

    按行查询

    -n 取消默认输出

    # #1、显示某一行,单行
    [root@luffy-001 oldboy]# sed -n '1p' person.txt 
    101,oldboy,CEO
    # #如果没有‘1p’,默认会显示所有内容
    # #2、显示连续多行
    [root@luffy-001 oldboy]# sed -n '2,4p' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    # #3、显示包含oldboy的行到包含104的行
    # #先看包含oldboy的行,记住要使用斜线//包起来
    [root@luffy-001 oldboy]# sed -n '/oldboy/p' person.txt 
    101,oldboy,CEO
    # #显示包含oldboy的行到以104开头的行(只用了特殊符号)
    [root@luffy-001 oldboy]# sed -n '/oldboy/,/^104/p' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    [root@luffy-001 oldboy]#
    # #4、 查询制定更多行,通过分号隔开
    [root@luffy-001 oldboy]# sed -n '2p;4p' person.txt 
    102,zhangyao,CTO
    104,yy,CFO

    过滤多个字符

    -r  sed选项,支持扩展正则表达式(|、()),默认情况,sed只支持基本正则表达式

    sed里面的正则字符左右必须要用“/”。

    sed命令通过正则表达式进行过滤========相当于egrep

    [root@luffy-001 oldboy]# egrep 'oldboy|yy' person.txt 
    101,oldboy,CEO
    104,yy,CFO
    
    [root@luffy-001 oldboy]# sed -rn '/oldboy|yy/p' person.txt 
    101,oldboy,CEO
    104,yy,CFO

    增加

    单行增加

    a   追加append,在指定行后面添加一行或者多行文本

    i    插入insert,在指定行前面添加一行或者多行文本

    # 在第三行后面增加
    [root@luffy-001 oldboy]# sed '3a 103.5,Lee,UFO' person.txt  
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    103.5,Lee,UFO
    104,yy,CFO
    105,feixue,CIO
    # 在第三行前面增加
    [root@luffy-001 oldboy]# sed '3i 103.5,Lee,UFO' person.txt  
    101,oldboy,CEO
    102,zhangyao,CTO
    103.5,Lee,UFO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    # 查看文件并没有被修改
    [root@luffy-001 oldboy]# cat person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    # $表示最后一行
    [root@luffy-001 oldboy]# sed -n '$p' person.txt 
    105,feixue,CIO
    # 在最后一行加入一行内容new、new、new
    [root@luffy-001 oldboy]# sed '$a new,new,new' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    new,new,new
    # echo >> 也可以在文件最后追加单行

    多行增加

    # 在最后加上多行(不常用,有其他方法)
    [root@luffy-001 oldboy]# sed '$a new,new,new
    old,old,old,old
    www' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    new,new,new
    old,old,old,old
    www
    # 使用cat命令向文件追加多行
    cat >>person.txt<<EOF
    new,new,new
    old,old,old,old
    www
    EOF

    删除

    单行删除

    [root@luffy-001 oldboy]# sed '$d' person.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    

    多行删除

    [root@luffy-001 oldboy]# sed '2,3d' person.txt 
    101,oldboy,CEO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '1,4d' person.txt 
    105,feixue,CIO

    不显示文件中的空行

    [root@luffy-001 oldboy]# cat -n person.txt 
         1    101,oldboy,CEO
         2    
         3    102,zhangyao,CTO
         4    103,Alex,COO
         5    
         6    104,yy,CFO
         7    
         8    105,feixue,CIO
    [root@luffy-001 oldboy]# cat -nA person.txt 
         1    101,oldboy,CEO$
         2    $
         3    102,zhangyao,CTO$
         4    103,Alex,COO$
         5    $
         6    104,yy,CFO$
         7    $
         8    105,feixue,CIO$
    [root@luffy-001 oldboy]# grep -v '^$' person.txt   使用grep,去反
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '/^$/d' person.txt    使用sed(正则)删除空行
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed -n '/^$/!p' person.txt   ! 表示去反
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@luffy-001 oldboy]# sed '$d' person.txt     删除最后一行
    101,oldboy,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    [root@luffy-001 oldboy]# sed '$!d' person.txt   删除不是最后一行的所有行
    105,feixue,CIO
    [root@luffy-001 oldboy]# 

    替换

    sed  -i   ‘s###g’   person.txt

    -i 修改文件   -i.ori 表示自动备份(先备份在修改)

    s 单独使用---->  将每一行匹配的字符进行替换

    g 每一行全部替换----> sed指令s的替换标志之一(全局替换)

    如何用sed进行变量替换

    ###将变量中的内容进行替换(只要考察单双引号的区别)
    #设置变量
    [root@luffy-001 oldboy]# x=oldboy
    [root@luffy-001 oldboy]# y=oldgirl
    [root@luffy-001 oldboy]# 
    #替换 使用 符号$
    [root@luffy-001 oldboy]# sed 's#$x#$y#g' person.txt 
    101,oldboy,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    105,feixue,CIO
    #必须要使用双引号
    [root@luffy-001 oldboy]# sed "s#$x#$y#g" person.txt 
    101,oldgirl,CEO
    
    102,zhangyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    
    105,feixue,CIO

    单引号:所见即所得

    双引号:与单引号类似,特殊符号会被解析 $  $()  `` !

    反向引用

    ()的功能可以记住正则表达式的一部分

    扩展正则,使用 -r

    1 应用第一个小括号中的匹配内容,2引用第二个小括号中的内容,sed最多可以记住9个

    题目:ehco "i am oldboy teacher" 如果想保留这一行的单词oldboy

    扩展

    特殊符号 = 获取行号

    [root@luffy-001 oldboy]# sed = person.txt 
    1
    101,oldboy,CEO
    2
    
    3
    102,zhangyao,CTO
    4
    103,Alex,COO
    5
    
    6
    104,yy,CFO
    7
    
    8
    105,feixue,CIO

    一条sed 语句至此那个多条命令

    每个 -e 选项后可以接一个sed指令

    分号的使用

    案例:一个文件100行,把5,35,70行单独拿出来

  • 相关阅读:
    17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication
    17.1.2 Replication Formats
    Setting the Master Configuration on the Slave
    17.1.1.9 Introducing Additional Slaves to an Existing Replication Environment
    17.1.1.8 Setting Up Replication with Existing Data
    17.1.1.7 Setting Up Replication with New Master and Slaves
    17.1.1.6 Creating a Data Snapshot Using Raw Data Files
    列出display的值,并说明它们的作用
    CSS设置DIV居中
    CSS选择符有哪些?哪些属性可以继承?优先级算法如何计算?
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/10395917.html
Copyright © 2011-2022 走看看