三剑客之sed

sed命令:Stream EDitor 流编辑器

sed命令的工作流程:

    sed会复制原文件中的一行或者多行,逐行进行操作。首先会将该行的内容放入到模式空间内,在模式空间内进行定界或者正则表达式匹配操作。

    a.如果该行内容不符合正则表达式或定界,该内容则被判断为No,进行标准输出。

    b.如果该行内容符合正则表达式或定界,该内容则被判断为Yes,进行编辑(包括标准输出)。

   sed中模式空间和保持空间中的内容会进行会换,这种会换会使文件内容进行多次的筛选编辑,完成复杂的任务。

    一般情况下,sed是不会改变原文件的内容,如果需要,可以加-i参数改变原文件的内容。(改变文件内容前最好将原文件进行变名的备份)

wKioL1enIj_Si5KVAABe3p3gDYc097.png

sed [OPTION] … 'script' [input-file]…

wKioL1enMerjFSyzAAAtSsZ9Y0I451.png

script:地址定界编辑命令


常用选项:

    -n:不输出模式空间中的内容至屏幕

    -e:实现多点编辑

    -f /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令

    -r:支持使用扩展正则表达式

    -i:直接编辑原文件


地址定界:

  1. 不给地址:对全文进行处理(空地址)

  2. 单地址:

        #:指定行

        /pattern/:被此模式所匹配到的每一行

  3. 地址范围:

        #,#:以第几行到第几行

        #,/pattern/:从指定的行开始到第1个pattern匹配到的行

        /par1/,/par2/:从第1个par匹配到的行到第2个par匹配到的行

        $:最后一行

  4. 步进地址:~

    1~2:所有奇数行

    2~2:所有偶数行


编辑命令:

    d:删除          例:sed ‘1,5d’ /etc/fstab  把fstab文件中的第1到第5行删除

    p:显示模式空间中的内容

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

    i \text :在行前面插入文本“text”,

例:

[root@localhost ~]# sed '3i \newline' /etc/fstab     #在第3行前面插入newline


#

newline

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016


[root@localhost ~]# sed '3i \newline\nthis is anther line' /etc/fstab #支持\n


#

newline

this is anther line

# /etc/fstab


c \text :把匹配到的行替换为此处指定的文本"text"

例:

[root@localhost ~]# sed '/^UUID/c \#new line' /etc/fstab  #将所有UUID开头的行替换                                                            为new line


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

#new line

#new line

#new line

#new line

tmpfs                   /dev/shm                tmpfs   defaults        0 0


w /PATH/TO/SOMEFILE/:保存模式空间匹配到的行至指定的文件中

例:

[root@localhost ~]# sed '/^[^#]/w /tmp/fstab.new' /etc/fstab  #将非#开头的行保存                                                                  到/tmp/fstab.new中

[root@localhost ~]# cat /tmp/fstab.new 

UUID=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0


r /PATH/FROM/SOMEFILE   :读取指定文件的内容到当前文件被模式匹配到的行的行后面,实现文件合并

例:

[root@localhost ~]# sed '/UUID/r /etc/issue' /etc/fstab  #在所有UUID开头的行后面插                                                           入/etc/issue文件内容


#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 0

CentOS release 6.8 (Final)

Kernel \r on an \m

tmpfs                   /dev/shm                tmpfs   defaults        0 0


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

!  :条件取反   (地址定界!编辑命令)

例:

[root@localhost ~]# sed '/^#/!d' /etc/fstab   #删除fstab文件中不以#开头的行

#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

[root@localhost ~]# 


s///  :查找替换,其分隔符可自行制定,常用的有s@@@,s###等。

替换标记:

    g  :全局替换

    w  :将替换成功的结果保存到指定的文件中

    p  :显示替换成功的行

例:

删除/boot/grwb/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符

sed 's@^[[:space:]]\+@@' /etc/grub2.cfg   #该/etc/grub2.cfg文件在linux7系统上


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

[root@localhost ~]# sed 's@^#[[:space:]]*@@' /etc/fstab


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

[root@localhost ~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'

/var/log/


高级编辑命令:

    h  :把模式空间中的内容覆盖至保持空间中

    H  :把模式空间中的内容追加至保持空间尾部

    g  :把保持空间中的内容覆盖至模式空间中

    G  :把保持空间中的内容追加至模式空间尾部

    x  :把模式空间中内容与保持空间中内容互换

    n  :覆盖读取匹配到的行下一行至模式空间中(覆盖原行)

    N  :追加读取匹配到的行下一行至模式空间中

    d  :删除模式空间中的行

    D  :删除多行模式空间中的所有行


例:

 

[root@localhost ~]# sed -n 'n;p' /etc/fstab   #显示偶数行

#

# Created by anaconda on Fri Jul  8 21:17:42 2016

# Accessible filesystems, by reference, are maintained under '/dev/disk'

#

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


[root@localhost ~]# sed '$!d' /etc/fstab           #取出最后一行

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed '$!N;$!D' /etc/fstab            #取出最后两行

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

                 

[root@localhost ~]# sed '/^$/d;G' /etc/fstab   #删除原有的所有空白行,而后为所有的                                                 非空白行后添加一个空白行

#


# /etc/fstab


# Created by anaconda on Fri Jul  8 21:17:42 2016


#


# Accessible filesystems, by reference, are maintained under '/dev/disk'


# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info


#


/dev/mapper/rhel-root   /                       xfs     defaults        0 0


UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed 'n;d' /etc/fstab      #显示奇数行


# /etc/fstab

#

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/rhel-root   /                       xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0


[root@localhost ~]# sed 'G' /etc/fstab            #在每一行后面添加空白行



#


# /etc/fstab


# Created by anaconda on Fri Jul  8 21:17:42 2016


#


# Accessible filesystems, by reference, are maintained under '/dev/disk'


# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info


#


/dev/mapper/rhel-root   /                       xfs     defaults        0 0


UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0


/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

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

赞 (0)
zebra930zebra930
上一篇 2016-08-08 16:08
下一篇 2016-08-08 16:08

相关推荐

  • LAMP

    备注:本次安装是采用的系统自带的yum源进行安装的 第一步:安装Apache 1:安装apache,命令如下: yum install -y httpd   2:修改httpd.conf,修改ServerName的域名,具体步骤如下: 使用vi编辑器打开apache配置文件,命令如下: vi /etc/httpd/conf/httpd.conf 按…

    Linux干货 2017-10-09
  • bash脚本编程之select语法详解

    shell编程之select select控制结构(在tcsh中不可用)基于Korn Shell中的控制结构 select语句首先显示一个菜单,然后根据用户的选择给变量赋予相应的值,最后执行一系列命令 其语法如下: select varname in list do commands done select 表达式是一种bash的扩展应用,动作包括: 自动用…

    Linux干货 2016-08-24
  • 七.Linux博客-2016年8月4日cat、cut、less、head、tail、wc、sort、uniq、grep

    格式说明: 操作 概念 命令 说明及举例 七.cat、cut、less、head、tail、wc、sort、uniq、grep cat cat -A a.txt 查看隐藏内容 cat -n a.txt 显示行号 cat -s a.txt 压缩空行,把多行空行压缩为一行 …

    Linux干货 2016-08-24
  • BASH编程基础之变量、条件判断

    一、前言 在linux中,通常我们所指的脚本编程,指的是bash的脚本编程。 bash作为一种过程式的编程语言来说,它应该具备编程语言所应该具备的基本元素,即:变量,流程,函数,数组。今天我们介绍变量以及流程之一的条件判断。 二、变量 1、初识变量 在编程语言中,编程语言有两大种,强类型语言和弱类型语言。强类型语言中,要求变量的使用要严格符合定义,所有变量都…

    Linux干货 2015-07-06
  • HA Cluster—Keepalived

    HA Cluster 集群类型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP 系统可用性的公式:A=MTBF/(MTBF+MTTR) 系统故障: 硬件故障:设计缺陷、wear out、自然灾害 软件故障:设计缺陷 提升系统高用性的解决方案之降低MTTR: 解决方案:冗余(redundant) acti…

    Linux干货 2017-10-30
  • IP地址与网络配置方式

    IP 地址 它们可唯一标识IP网络中的每台设备 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址 IP地址由两部分组成: (总共32位) 网络ID: 标识网络 每个网段分配一个网络ID 主机 ID: 标识单个主机 由组织分配给各设备   IP 地址分类 32位IP=网络ID+主机ID A 类: 前8位是网络ID位,后24位是主机ID位 00…

    2017-05-07

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-10 15:00

    文章写的很详细,从原理到常见用法总结的很棒,有理论有操作。