Sed文本文件工具的使用详解

Sed文本文件工具的使用详解

一、概述

sed 工具实际上就是一个非交互式的编辑器,主要是为了处理文本而生的,我们知道处理文本的三剑客是 grep sed awk 我们之前学习过 grep 文本过滤工具,它的主要作用是为了过滤文本,而sed 工具也是过滤文本,只不过sed工具针对的是文件中的每一行,而且sed工具更加强大,下面还具体说明一下sed 工具的原理。

二、sed 原理

sed 工具实际上的原理,我用一幅图给大家阐述一下: 
我这里引用一篇博客中对sed工具的定义: 
sed工具全称为流式编辑器,它可以被使用作为行过滤器(顾名思义sed是按照行查找进行操作的),它的工作原理可以描述为:把前一个程序的输出引入到sed的输入,经过一系列编辑命令转换为另外一种格式输出。(形象的解释如下图所示,模式空间会在后面单独提出)

sed是一个非交互式的流编辑器(stream editor)。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。

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

pattern space(模式空间)相当于车间sed把流内容在这里处理; 
hold space(保留空间)相当于仓库,加工的半成品在这里临时储存(当然加工完的成品也在这里存储)。

How sed Works:

先读入一行,去掉尾部换行符,存入pattern space,执行编辑命令。 
处理完毕,除非加了-n参数,把现在的pattern space打印出来,在后边打印曾去掉的换行符。 
把pattern space内容给hold space,把pattern space置空。 
接着读下一行,处理下一行。

一种非平凡情况,一个文件仅一行,尾部没换行,sed只打印,不会尾部加换行,但若在尾部又附加了输出,他会再补上那个换行。

blob.png

blob.png

下面我们边举例子 边来介绍sed 命令的选项和sed 命令的用法:

三、sed 命令的选项及其用法

要想真正了解并熟练使用sed 命令,必须知道sed 命令的执行过程,sed 命令是按照模式进行匹配后输出的,sed命令中有2个空间,一个叫做模式空间(pattern mode) 一个叫做保留空间(hold mode) 我们可以把模式空间想象成为一个流水线,把保留空间想象成为一个仓库, 
比如下面的命令

    sed '2,3p' /etc/fstab

执行的过程其实是这样,我画一幅图来展示一下执行的流程,我们先来看/etc/fstab 中的内容:

 1  
2  #
3  # /etc/fstab
4  # Created by anaconda on Tue Aug 23 16:38:07 2016
5  #
6  # Accessible filesystems, by reference, are maintained under '/dev/disk'
7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8  #
9  /dev/mapper/centos-root /                       xfs     defaults        0 0
10  UUID=79e2f3d9-4bd1-4b1c-beda-dcac56065789 /boot                   xfs     defaults        0 0
11  /dev/mapper/centos-home /home                   xfs     defaults        0 0
12  /dev/mapper/centos-swap swap                    swap    defaults        0 0
13  /dev/sdc1 /mydata ext4 defaults 0 0  

当我们执行sed 命令的时候,他是把文件中的内容一行一行读入到模式空间中,

blob.png

通过上面我这个草图可以看出,sed 执行的时候是一行一行的把文件中的内容读入到模式空间中,然后再分析sed命令进行匹配,最后输出到标准输出(显示器)上。

下面我介绍一下sed的常用选项并通过习题练习讲解sed的基本用法和高级用法,首先我们man 一下sed

    sed - stream editor for filtering and transforming text

   sed [OPTION]... {script-only-if-no-other-script} [input-file]..
3.1[option] 选项介绍:

1、 -n 选项 不输出模式空间中的内容至屏幕 
例如:

     [root@localhost test2]# cat -n /etc/fstab
    1  
    2  #
    3  # /etc/fstab
    4  # Created by anaconda on Tue Aug 23 16:38:07 2016
    5  #
    6  # Accessible filesystems, by reference, are maintained under '/dev/disk'
    7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    8  #
    9  /dev/mapper/centos-root /                       xfs     defaults        0 0
   10  UUID=79e2f3d9-4bd1-4b1c-beda-dcac56065789 /boot                   xfs     defaults        0 0
   11  /dev/mapper/centos-home /home                   xfs     defaults        0 0
   12  /dev/mapper/centos-swap swap                    swap    defaults        0 0
   13  /dev/sdc1 /mydata ext4 defaults 0 0  
   [root@localhost test2]# cat -n /etc/fstab | sed -n '2,3p'
        2  #
        3  # /etc/fstab
   [root@localhost test2]#

2、 -e 选项 意义为多点编辑 也就是-e 后面可以加很多的命令 例如:

如果有这样一个要求,把/etc/fstab 文件中的所有以#开头的行都替换成空白 并且把以UUID 开头的行都删除

我们的命令需要这样写:

[root@localhost test2]# sed -e 's@^#[[:space:]]*@@g' -e '/^UUID/d' /etc/fstab


/etc/fstab
Created by anaconda on Tue Aug 23 16:38:07 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/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdc1 /mydata ext4 defaults 0 0  
[root@localhost test2]#

3、-f 选项 /PATH/TO/SED_SCRIPT_FILE 每行一个编辑命令 ,可以把-e 的多行编辑命令写到一个文件里,例如

把刚才上面的例子-e 后面的选项内容写到文件中,我们可以向下面这样执行 
我们首先用vim 命令创建出一个文本文件,在文本文件中加入刚才-e 后面的命令

s@^#[[:space:]]*@@g
/^UUID/d

然后我们在用下面的-f 选项来执行这个文件就可以了:

[root@localhost test2]# sed -f test.sh /etc/fstab


/etc/fstab
Created by anaconda on Tue Aug 23 16:38:07 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/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdc1 /mydata ext4 defaults 0 0  
[root@localhost test2]#

最后的执行结果和上面用-e 的执行结果是一样的

4、-r 支持使用扩展正则表达式 
这个比较简单,这里就不再说明了,就是使用扩展的正则表达式进行匹配 
5、-i 选项,比较危险,这个命令是直接边界源文件的,例如:

[root@localhost test2]# sed -i '/^UUID/d' fstab
[root@localhost test2]# cat fstab

#
# /etc/fstab
# Created by anaconda on Tue Aug 23 16:38:07 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/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdc1 /mydata ext4 defaults 0 0  
[root@localhost test2]#

可以发现fstab 中的以UUID 开头的文本都删除了,没有了,所以一定要注意 不要直接修改源文件,要把源文件备份一份以后在进行修改

3.2 sed 编辑命令

1、d 删除命令 
2、p 显示模式空间中的内容 
3、a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
4、i \text:在行前面插入文本“text”,支持使用\n实现多行插入; 
5、c \text:把匹配到的行替换为此处指定的文本“text”; 
6、w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中; 
7、r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并; 
8、=:为模式匹配到的行打印行号; 
9、!:条件取反; 
地址定界|编辑命令; 
10、s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等; 
替换标记: 
g:全局替换; 
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中; 
p:显示替换成功的行;

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

之前的/boot/grub/grub.conf

blob.png

[root@localhost test]# sed 's/^[[:space:]]\+//g' /boot/grub/grub.conf
执行后的结果:

blob.png

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

blob.png

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

blob.png

上述命令就是sed 基本用法,我们也需要了解一下sed的高级用法:

高级编辑命令: 
h:把模式空间中的内容覆盖至保持空间中; 
H:把模式空间中的内容追加至保持空间中; 
g:把保持空间中的内容覆盖至模式空间中; 
G:把保持空间中的内容追加至模式空间中; 
x:把模式空间中的内容与保持空间中的内容互换; 
n:覆盖读取匹配到的行的下一行至模式空间中; 
N:追加读取匹配到的行的下一行至模式空间中; 
d:删除模式空间中的行; 
D:删除多行模式空间中的所有行;

我们看这样2个例题:

1、sed ‘1!G;h;$!d’ file 这个命令的执行过程究竟是怎样的,最后达到一个什么目的,我以一幅图的形式给大家展示一下执行过程:

blob.png

2、sed -n ‘1{h;n;x;H;x};p’ filename 这个命令的执行过程是下图:

blob.png

以上就是我对于sed 命令的理解。

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

(0)
luobo3692003luobo3692003
上一篇 2016-10-09
下一篇 2016-10-09

相关推荐

  • N25第九周博客作业

    1、 写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/sh lg=0 nlg=0 while read line;do   if [[ “${line}” =~“/sbin/nol…

    Linux干货 2017-03-06
  • Linux程序包管理

      Linux的各个release版本开发商,在发布各种应用程序,以及一些团体发布应用程序时,通常会根据发布的程序所适应的开发语言,使用环境,预设参数等,事先编译完成一个可以在相应平台上安装的程序包供使用者直接使用,该程序包含有安装前(preinstall)操作系统环境检测的脚本,程序包中所有文件的相关信息,程序预定义的配置参数文件,程序…

    Linux干货 2016-11-30
  • 模拟centos6.8系统下initramfs文件和vmlinuz文件损坏恢复

    实验一:关于删除initramfs-2.6.32-642.el6.x86_64.img 文件恢复实验,实验环境centos6.8系统 1.安全起见,请先安排做快照及备份 把initramfs-2.6.32-642.el6.x86_64.img 文件复制一份/root目录下。 [root@centos6: boot]# cp -a initramfs-2.6.…

    2017-05-15
  • 人志建,则无敌—网络基本知识加简单脚本练习

    马哥21期网络班-8周博客作业 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:网桥就是把2个不同的网段桥接起来;可隔离冲突域。 集线器:集线器就是把多根以太网线或光纤集合连接在同一段物理介质下的装置;工作在物理层;不能隔离冲突域。 二层交换机:工作于OSI模型的第2层(数据链路层),故而称为二层交换机。二层交换技术的发…

    Linux干货 2016-08-29
  • N25-第一周 总结

    一、描述计算机的组成及其功能     CPU:包括运算器、控制器、寄存器、缓存,计算枢纽,网络的包处理、磁盘读写、数学计算等。     内存:加载数据,提高计算速度,程序被加载到内存成为进程运行。     输入:键盘、鼠标     输出:打印机、显示器 二、按系列罗列linux的…

    Linux干货 2016-12-05
  • Linux ssh安全远程登录

                   Linux ssh安全远程登录 本章内容:     构建SSH远程登录系统     SSH(secure shell)是标准的网络协议,主要用于实现字符界面的远程登录管理…

    Linux干货 2016-10-10