Linux之sed详解

文本处理三剑客:
   grep, egrep, fgrep:文本过滤器
   sed:Stream EDitor,流编辑器,行
   awk:文本格式化工具,报告生成器

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”
(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

sed命令格式

sed [OPTION]...  ‘script‘  [input-file] ...
     script:地址定界编辑命令

常用选项(OPTION):
   -n:不输出模式空间中的内容至屏幕;
   -e script, --expression=script:多点编辑;
   -f  /PATH/TO/SED_SCRIPT_FILE
      每行一个编辑命令;
   -r, --regexp-extended:支持使用扩展正则表达式;
   -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;
      ~]# sed  -e  ‘[email protected]^#[[:space:]]*@@‘   -e  ‘/^UUID/d‘  /etc/fstab
        
地址定界(script):
   (1) 空地址:对全文进行处理;
   (2) 单地址:
       #:指定行;
       /pattern/:被此模式所匹配到的每一行;
   (3) 地址范围
       #,#:
       #,+#:
       #,/pat1/
       /pat1/,/pat2/
       $:最后一行;
   (4) 步进:~
       1~2:所有奇数行
       2~2:所有偶数行
                
编辑命令:
   d:删除;
   p:显示模式空间中的内容;
   a  \text:在行后面追加文本“text”,支持使用\n实现多行追加;
   i  \text:在行前面插入文本“text”,支持使用\n实现多行插入;
   c  \text:把匹配到的行替换为此处指定的文本“text”;
   w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
   r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
   =:为模式匹配到的行打印行号;
   !:条件取反;
       地址定界!编辑命令;
   s/*/*/*:查找替换,其分隔符可自行指定,常用的有[email protected]@@, s###等;
      替换标记:
        g:全局替换;
        w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
        p:显示替换成功的行;

举例:(将/etc/fstab文件cp到/tmp/fstab下)

删除某行

[[email protected] ~]# sed ‘1d‘ /tmp/fstab #删除第一行
[[email protected] ~]# sed ‘$d‘ /tmp/fstab #删除最后一行
[[email protected] ~]# sed ‘1,2d‘ /tmp/fstab #删除第一行到第二行
[[email protected] ~]# sed ‘/boot/d‘ /etc/fstab #删除包含boot字符串的行

显示某行

[[email protected] ~]# sed -n ‘6p‘ /tmp/fstab   #显示第6行

这里要加上-n选项,否则模式空间里的内容为文件的全部内容,默认也会输出。

[[email protected] ~]# sed -n ‘2,$p‘ /tmp/fstab  #显示第二行到最后一行

使用模式进行查询

 [[email protected] ~]# sed -n ‘/^#/p‘ /tmp/fstab #查询以#开头的行并输出

文本插入、替换

文本插入

[[email protected] ~]# sed ‘/^#/a \this test‘ /tmp/fstab

a \text:在行后面追加文本“text”,支持使用\n实现多行追加;

[[email protected] ~]# sed ‘/^#/i \this test‘ /tmp/fstab

i  \text:在行前面插入文本“text”,支持使用\n实现多行插入

行替换

[[email protected] ~]# sed ‘/^#/c\*‘ /tmp/fstab

将以#开头的行替换为*

[[email protected] ~]# sed -n ‘/^#/w/tmp/sed.txt‘ /tmp/fstab

保存模式空间匹配到的行至指定的文件中。将以#开头的行保存到/tmp/sed.txt中

文件合并(读取指定文件的内容至当前文件被模式匹配到的行后面)

[[email protected] ~]# sed ‘/^#/ r ./abc.txt‘ /tmp/fstab

将以#号开头的行后面分别加上abc.txt文件里的内容

为模式匹配到的行打印行号

[[email protected] ~]# sed ‘/^#/=‘ /tmp/fstab

文本查找与替换

 [[email protected] ~]# sed ‘[email protected]#@*@g‘ /tmp/fstab

将#替换为*。文本字符串替换

[[email protected] ~]# sed ‘[email protected]#@*@w abc.txt‘ /tmp/fstab

将符合替换条件的行写入到文本中

[[email protected] ~]# sed ‘[email protected]@[email protected]‘ /tmp/fstab

将UUID替换为uuid

练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;

[[email protected] ~]#sed  ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg

练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;

[[email protected] ~]# sed  ‘[email protected]^#[[:space:]]*@@‘  /etc/fstab

练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;

[[email protected]  ~]# echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘    
[[email protected] ~]# echo "/var/log/messages" | sed -r ‘[email protected][^/]+/[email protected]@‘

------------------------------------------高级进阶-----------------------------------------

高级编辑命令:
    h:把模式空间中的内容覆盖至保持空间中;
    H:把模式空间中的内容追加至保持空间中;
    g:把保持空间中的内容覆盖至模式空间中;
    G:把保持空间中的内容追加至模式空间中;
    x:把模式空间中的内容与保持空间中的内容互换;
    n:覆盖读取匹配到的行的下一行至模式空间中;
    N:追加读取匹配到的行的下一行至模式空间中;
    d:删除模式空间中的行;
    D:删除多行模式空间中的所有行;
            
示例:
  sed  -n  ‘n;p‘  FILE:显示偶数行;
  sed  ‘1!G;h;$!d‘  FILE:逆序显示文件的内容;
  sed  ’$!d‘  FILE:取出最后一行;
  sed  ‘$!N;$!D‘ FILE:取出文件后两行;
  sed ‘/^$/d;G‘ FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
  sed  ‘n;d‘  FILE:显示奇数行;
  sed ‘G‘ FILE:在原有的每行后方添加一个空白行;

时间: 2024-09-30 04:47:53

Linux之sed详解的相关文章

三剑客之 sed详解

    sed 作者:Jack.X 归档:学习笔记 2017/4/13 三剑客之sed 第1章 sed详解: 1.1 sed介绍: sed是linux命令中三剑客的老二,sed命令是操作.过滤和转换文本内容的强大工具,常用功能有增删改查(增加,删除,修改,查询).其中查询的功能中最常用的两大功能是过滤(过滤指定字符串),取行(取出指定行). 我先在用的sed版本是GNU开源版本的,实验环境是Centos6.8系统,内核是2.6.32-642.el6.x86_64 [[email protecte

linux中断流程详解

异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核搭建了一个非常容易扩充的中断处理体系. 中 断系统结构涉及的方面很多,而且分布在很多的函数中,这里我主要理清一些结构和流程顺序已经在哪些函数中实现,我不知道其他人怎么样?但是我自己一开始怎 是找不到linux内核是怎么把GPIO设置成中断的,我找了很久都找不到,还有我们很多的设置,初始化等等东西好像

Linux集群详解

Linux集群详解 集群或者说是群集:其目的是为了实现将多台计算机组合以来完成特定的任务,比如天气预报,大型网络游戏,这些都需要很大的运算量,单台计算机实现成本太高,而且不显示.那么就需要通过集群的方式,将废弃的或者正在使用的计算机联合起来,结合整体的力量来解决这些问题 集群类型: 1.  负载均衡集群 load blancing ,简称LB 2.  高可用性集群 high availibility,简称 HA 3.  高性能集群 high performance,简称 HP 作用: 1.  负

Linux awk 命令详解

简介linux awk命令详解 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的

linux awk命令详解(都是常用命令)

原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它

Monitorix监控Linux主机图文详解

Monitorix监控Linux主机图文详解 Monitorix简介 Monitorix 是一款自由开源的轻巧型系统监视工具.使用 Monitorix你可以随时掌控 CPU 负载及温度.内存占用.活动进程.磁盘使用及温度.网络设备流量.网络服务等全方位的系统信息.Monitorix 需要 Apache Web 服务器来显示这些系统信息图表.所以它特别适合在 Linux 服务器上面使用. 下面是我安装的步骤 1.安装的环境和需要的rpm包 我是在CentOS 6.4下面安装的CentOS 5可以使

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

linux FTP配置详解

一.vsftpd说明: LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问FTP服务器时需要经过验证,只有经过了FTP服务器的相关验证,用户才能访问和传输文件.vsftpd提供了3种ftp登录形式:  (1)anonymous(匿名帐号) 使用anonymous是应用广泛的一种FTP服务器.如果用户在FTP服务器上没有帐号,那么用户可以以anonymous为用户名,以自己

Linux磁盘阵列技术详解(二)--raid 1创建

我在Linux磁盘阵列技术详解(一)里已经详细介绍了几种RAID磁盘阵列方式,原理以及创建raid 0 的详细步骤.那么这篇文档就着重讲解如何创建raid 1的技术: 步骤如下: ① 分区 同样我们还是以一块硬盘的不同分区为例,实际工作中应该是不同的硬盘才对. 具体分区步骤不再赘述! 分区后结果如下图所示: ② 创建raid 1 mdadm -C -v /dev/md1 -l 1 -n 2 -x 1 /dev/sdc1 /dev/sdc2 /dev/sdc3 或者 mdadm -C -v /de