美文网首页
shell编程-sed

shell编程-sed

作者: 小浪浮华 | 来源:发表于2020-06-22 14:38 被阅读0次

    一、语法

    sed [-hnV][-e<script>][-f<script文件>][文本文件]

    参数说明:

    -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
    -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
    -h或--help 显示帮助。
    -n或--quiet或--silent 仅显示script处理后的结果。
    -V或--version 显示版本信息。

    动作说明

    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g

    注:

    在sed后加上-i执行后会修改原文件
    $代表最后的意思

    二、以行为单位的新增/删除

    1.删除2~5行删除
    sed '2,5d'
    2.只删除第2行
    sed '2d'
    3.删除第3到最后一行
    sed '3,$d'
    4.在第2行后(亦即是加在第三行)加上drink tea?字样
    sed '2a drink tea?'
    5.在第2行前加上drink tea?字样
    sed '2i drink tea?'
    6.2行之后追加两行,例如Hello......与shell!
    sed '2a Hello......\
    \>shell!'
    sed '2a Hello......\shell!'
    7.2行之后追加三行(2行文字,1行空行)
    sed '2a Hello......\shell!\n'
    8.2行之后追加一行空行
    sed '2a \ '
    sed '2a \\'
    9.2行之后追加两行空行
    sed '2a \\n'
    

    三、以行为单位的替换与显示

    1.将2~5行的内容取代成Hello shell
    sed '2,5c Hello shell'
    2.显示文件的5~7行
    sed -n '5,7p'
    

    四、数据的搜寻并显示

    1.搜索有关root关键字的行
    sed -n '/root/p'
    

    使用-n的时候只打印包含模板的行

    五、数据的搜寻并删除

    1.删除包含root的行,其他行输出
    sed '/root/d'
    

    六、数据的搜寻并执行命令

    1.找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里Hello替换成bash
    sed -n '/root{s/Hello/bash/;p;q}'
    

    最后的q是退出

    七、数据的搜寻并替换

    1.基本格式
    sed 's/要被取代的字符串/新的字符串/g'
    2.文本里每一行结尾若为.则换成!
    sed 's/\\.$/\\!/g'
    
    例:提取ip
    /sbin/ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.0.116  netmask 255.255.255.0  broadcast 192.168.0.255
            inet6 fe80::f816:3eff:fe47:959d  prefixlen 64  scopeid 0x20<link>
            ether fa:16:3e:47:95:9d  txqueuelen 1000  (Ethernet)
            RX packets 1388641  bytes 402972654 (384.3 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1408963  bytes 164970470 (157.3 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    /sbin/ifconfig eth0 | grep 'inet'     //inet后边没有空格
            inet 192.168.0.116  netmask 255.255.255.0  broadcast 192.168.0.255
            inet6 fe80::f816:3eff:fe47:959d  prefixlen 64  scopeid 0x20<link>
    /sbin/ifconfig eth0 | grep 'inet '    //inet后边有一个空格
            inet 192.168.0.116  netmask 255.255.255.0  broadcast 192.168.0.255
    
    /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/inet //g'    //无^.*inet 
            192.168.0.116  netmask 255.255.255.0  broadcast 192.168.0.255
    /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*inet //g'
    192.168.0.116  netmask 255.255.255.0  broadcast 192.168.0.255
    
    /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/netmask//g'    //无netmask.*$
    192.168.0.116   255.255.255.0  broadcast 192.168.0.255
    /sbin/ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' |sed 's/netmask.*$//g'
    192.168.0.116    //获得ip
    

    八、多点编辑

    1.删除第3行到末尾的数据,并把bash替换成Hello
    sed -e '3,$d' -e 's/bash/Hello/'
    

    -e表示多点编辑,第一个编辑命令删除第3行到末尾的数据,第二条命令搜索bash替换为Hello

    示例文件
    #vim shell_sed.txt
    zhangsan
    zhangsan
    lisi
    lisi

    wangwu
    wangwu
    用ergou替换lisi:
    #sed -i 's/lisi/ergou/' shell_sed.txt
    使用多重指令:
    #sed -i 's/lisi/ergou/ ; s/zhangsan/lisi/' shell_sed.txt
    使用脚本文件:
    脚本:name
    s/lisi/ergou/
    s/zhangsan/lisi/
    sed -f name shell_sed.txt
    sed -f name shell_sed.txt >newshell_sed.txt //执行脚本并保存修改后的文件

    sed流编辑器用法及解析

    sed '1d' shell_sed.txt  //删除文件的第一行
    sed '1,2d' shell_sed.txt  //删除文件的第一、第二行
    sed '2,$d' shell_sed.txt  //删除文件的第二行到最后一行
    sed '/root/d' shell_sed.txt  //删除匹配到root的一行
    sed '/root/2d' shell_sed.txt  //删除匹配到root的一行以及下一行
    sed '1~2d' shell_sed.txt  //删除奇数行
    sed '0~2d' shell_sed.txt  //删除偶数行
    sed 's/wangwu/lisi/g' shell_sed.txt  //全局替换
    sed 's/wangwu/lisi/gi' shell_sed.txt  //忽略大小写的全局替换
    sed '/^$/d' shell_sed.txt  //删除空行
    sed -i.bak 's/wangwu/lisi/' shell_sed.txt  //产生一个备份的文件以防后悔 
    

    相关文章

      网友评论

          本文标题:shell编程-sed

          本文链接:https://www.haomeiwen.com/subject/dypxfktx.html