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行单独拿出来

  • 相关阅读:
    面试官是如何筛选简历?
    成为一名架构师得学习哪些知识?
    一个对话让你明白架构师是做什么的?
    教你一招用 IDE 编程提升效率的骚操作!
    80个让你笑爆肚皮的程序员段子,不好笑算我输!
    Java初学者最佳的学习方法以及会遇到的坑(内含学习资料)!
    作为程序员的你,一年看几本技术相关的书
    MEF 插件式开发之 DotNetCore 中强大的 DI
    MEF 插件式开发之 DotNetCore 初体验
    读 《CSharp Coding Guidelines》有感
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/10395917.html
Copyright © 2011-2022 走看看