了解sed

本博客分为四个部分:
sed介绍、sed用法、sed高级用法(简略带过)、相关例题。
通过本文可以大致了解sed命令。深度可以当成是课前预习吧。

1、sed介绍
Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容 ,处理完成后,把缓冲区的内容送往屏幕。接着处理下一 行,这样不断重复,直到文件末尾。文件内容并没有改变 ,除非你使用重定向存储输出。Sed主要用来自动编辑一 个或多个文件,简化对文件的反复操作,编写转换程序

2、sed用法
sed [option]… ‘script’ inputfile…  

常用选项:
    -n:不输出模式空间内容到屏幕,即不自动打印
    -e: 多点编辑
        注:通过后面例题,个人理解该命令是用来合并多条地址命令的
    -f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
        注:用来编写复杂的地址命令
    -r: 支持使用扩展正则表达式
    -i.bak: 备份文件并原处编辑
        -i:直接在原处编辑,此选项慎用

script:
    ‘地址命令’

地址定界:
(1) 不给地址:对全文进行处理
        注意:这里不给地址也要有”,不然会出错
(2) 单地址:
        #: 指定的行
        /pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
        #,# 第#行到第#行
        #,+# 第#行到其后#行
        /pat1/,/pat2/
        #,/pat1/         
(4) ~:步进
        1~2 奇数行
        2~2 偶数行

 编辑命令:
     d: 删除模式空间匹配的行
     p: 显示模式空间中的内容
     a []text:在指定行后面追加文本 支持使用\n实现多行追加
     i []text:在行前面插入文本
     c []text:替换行为单行或多行文本
     w /path/somefile: 保存模式匹配的行至指定文件
     r /path/somefile:读取指定文件的文本至模式空间中 匹配到的行后
     =: 为模式空间中的行打印行号
     !:模式空间中匹配行取反处理(跟在要取反部分后面)

    s///:查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
        g: 行内全局替换
        p: 显示替换成功的行

        w /PATH/TO/SOMEFILE:将替换成功的行保存至文件

3、sed高级(danteng)用法
高级编辑命令:
    h: 把模式空间中的内容覆盖至保持空间中
    H:把模式空间中的内容追加至保持空间中
    g: 从保持空间取出数据覆盖至模式空间
    G:从保持空间取出内容追加至模式空间
    x: 把模式空间中的内容与保持空间中的内容进行互换
    n: 读取匹配到的行的下一行覆盖至模式空间 N:读取匹配到的行的下一行追加至模式空间
    d: 删除模式空间中的行
    D:删除当前模式空间开端至\n的内容(不再传至标准输 出),放弃之后的命令,但是对剩余模式空间重新执行sed
    这一部分功能确实很强大,但是不容易记忆、理解和掌握。掌握基本用法才是王道。

    sed -n ‘n;p’ FILE
    sed ‘1!G;h;$!d’ FILE
    sed ‘$!N;$!D’ FILE
    sed ‘$!d’ FILE
    sed ‘G’ FILE
    sed ‘g’ FILE
    sed ‘/^$/d;G’ FILE
    sed ‘n;d’ FILE
    sed -n ‘1!G;h;$p’ FILE
    看懂并会用以上,则sed神功已成。

4、相关例题解答(大部分都没有标准答案,自己尝试写的)
1
删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符
sed “s@^[[:space:]]+@@” /boot/grub/grub.conf 错误解答
sed ‘s@^[[:space:]]+@@ /boot/grub/grub.conf 正解
这里地址命令默认是使用基本正则表达式,需要写成+

2
删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行 的行首的#和空白字符
sed ‘s@^#[[:space:]]+@@’ /etc/fstab
基本正则表达式的用法

3
在centos6系统/root/install.log每一行行首增加#号
sed ‘s@^@#&@’ /root/install.log
经过实验结果正确。
思路:只要匹配到了行首,就在行首之前加上#替换原行首。

4
在/etc/fstab文件中不以#开头的行的开头增加#号
sed ‘s@^[^#]@#&@’ /etc/fstab
和第三题属于同一类型。

5

处理/etc/fstab路径,使用sed命令取出其目录名和基名

讲道理上面已经解决了一个更为复杂的情况

echo /etc/fstab|sed ‘s@[^/]\+$@@’ 取出目录名

echo /etc/fstab|sed ‘s@^/.*/@@’ 取出基名

以上两种方法足以处理给定形式下的路径名。

拓展思考:

可以考虑怎么解决/etc/fstab/形式下的路径。

echo一个绝对路径给sed命令,取出其基名;取出其目录名;

echo /etc/passwd|sed ‘s@[^/]\+\/?$@@’能够应对结尾带/的特殊情况 取出目录名

echo /etc/passwd|sed ‘s@^/[^/]*/@@’不能应对结尾带/的特殊情况 取出基名

随后想到先去掉结尾可能存在的/不就好了。修改后的解答如下:

echo /etc/passwd/|sed ‘s@/\?$@@’|sed ‘s@^/[^/]*/@@’能够应对结尾出现/的特殊情况取出基名

顺便尝试用-e来合并后两部分的地址命令

最终结果如下:

echo /etc/passwd/|sed -e ‘s@/\?$@@;s@^/[^/]*/@@’

6
利用sed取出ifconfig命令中的本机的ipv4地址
ifconfig|sed -n ‘/\<inet\>/p’ 能够取出inet的行
去过要单独取出inet,需要大量后续处理。

7
统计centos安装光盘中package目录下所有rpm文件的以.分隔倒数第二个字段的重复次数
ls /mnt/yum/Packages|grep -o “[^.]+.rpm$”|cut -d”.” -f1|sort|uniq -c

sed方法暂时没有想好。对于使用sed进行数据统计不了解。

这里我尝试用sed -n ‘/[^.]\+\.rpm$/p’代替grep部分,但是结果是错误的。

8
统计/etc/init.d/functions文件中每个单词的出现次数,并排序
grep和sed两种方法分别实现。
不太清楚怎么依次统计所有单词的出现次数。

9
将文本文件的n和n+1行合并为一行,n为奇数行
上网查的方法。讲道理sed的高级用法虽然强大但真的不容易理解。
sed ‘N;s/\n//’ test.txt
N读取匹配到的行的下一行追加至模式空间
s然后是进行替换,把模式空间中的换行符去掉,从而完成两行合并成一行。

原创文章,作者:maru,如若转载,请注明出处:http://www.178linux.com/74250

(0)
marumaru
上一篇 2017-04-25 20:01
下一篇 2017-04-25 21:39

相关推荐

  • 17周博客作业 LVS+nginx+php(nginx与php分离)

    1、结合图形描述LVS的工作原理; LVS是一种用软件实现的LB集群; 作用于传输层; LVS工作原理:通过Director调度把用户请求按照分配算法分配给后端的Real server,然后由后端Real server响应客户请求; lvs模式分为三种。 lvs-nat: 多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某…

    Linux干货 2016-11-07
  • 如何在 Linux 下大量屏蔽恶意 IP 地址

    很多情况下,你可能需要在Linux下屏蔽IP地址。比如,作为一个终端用户,你可能想要免受间谍软件或者IP追踪的困扰。或者当你在运行P2P软件时。你可能想要过滤反P2P活动的网络链接。如果你是一名系统管理员,你可能想要禁止垃圾IP地址访问你们的公司邮件服务器。或者你因一些原因想要禁止某些国家访问你的web服务。在许多情况下,然而,你的IP地址屏蔽列表可能会很快…

    Linux干货 2015-02-26
  • 网络服务之Nginx

      在之前一篇博客中我们讲述了httpd网络服务器,那么httpd是个非常稳定安全的一个服务器,这次我们介绍一个新的网络服务器—-nginx。   Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器(我们主要围绕这两…

    2017-06-07
  • 第八周:网络基础知识和shell脚本练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别; 网桥:是连接两个局域网的基于MAC地址数据存储转发设备,工作于数据链路层 集线器:所有端口处于同一个广播域和冲突域中,带宽共享,工作于物理层 二层交换机:多端口网桥,一个端口一个冲突域,默认所有端口位于同一个广播域中,可以划分vlan,隔离广播域,带宽独享 三层交换机:具有路由功…

    Linux干货 2016-11-21
  • CentOS启动流程及Shell脚本编程练习

    一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 第一步:POST加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序。 第二步:Boot Sequence(选择启动设备以加…

    2017-11-26
  • 设计模式(十一)代理模式Proxy(结构型)

    1.概述        因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供…

    Linux干货 2015-07-09

评论列表(1条)

  • renjin
    renjin 2017-04-28 09:39

    对sed命令进行了介绍 ,内容写的很详细,注意一下排版,你的那个代码块还是没有注意到,下次要注意一些。