linux sed命令

linux sed命令

简介:

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

补充:提取某一行中的内容而用sed 匹配时,一定要先匹配到那一行后然后用后向引用把那一行中的所去的内容用反向引用 \1 或者 & **把它提取出来

用法:

            sed [option]…    ' script '    inputfile…

常用选项:

  • -n:不输出模式空间内容的自动打印

  • -e: 多点编辑

  • -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本

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

  • -i: 原处编辑

script:

'  地址命令  '

地址定界
(1) 不给地址:对全文进行处理
(2) 单地址:

 #: 指定的行
 /pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围:

 #,#
 #,+#
/pat1/,/pat2/
#,/pat1/

(4) ~:步进

     1~2 奇数行(显示奇数行)
     2~2 偶数行(显示偶数行)

记住:单引号' ' 里面的是地址命令,要加地址范围 / /才能匹配

编辑命令:

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

s///:查找替换,支持使用其它分隔符,s@@@,s###

替换标记:

    如果不加 就说明只  替换每行的第一个匹配到的内容
    g: 行内全局替换
    p: 显示替换成功的行
    w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

其中&表示 /1/&/ 这里的&就是1的内容

    在aaa后面添加字段:sed -ne 's/aaa/HELLO&/p' test 
    输出结果:HELLOaaa
    在前后同时添加:sed -ne 's/aaa/&HELLO&/p' test 
    输出结果:aaaHELLOaaa
    以行为单位的新增/删除

这种只是行内操作

练习

1、将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除

    [root@www ~]# nl /etc/passwd | sed '2,5d'
    1 root:x:0:0:root:/root:/bin/bash
    6 sync:x:5:0:sync:/sbin:/bin/sync
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2、仅列出 /etc/passwd 文件内的第 5-7 行

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lop:x:4:7:lop:/var/spool/lopd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

3、多点编辑:一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为sheller

nl /etc/passwd | sed -e '3,$d' -e 's/bash/sheller/'
1  root:x:0:0:root:/root:/bin/sheller
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

4、从某行到某行的打印

sed -n '/^root/,/^s/p' /etc/passwd

*后向引用的用法,匹配等用法:

1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符

[root@qzx tmp]# sed 's@^[[:space:]]+@@' /etc/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

[root@qzx tmp]# sed  's@^#[[:space:]]\+@@' /etc/fstab

3、在/root/install.log每一行行首增加#号

#Installing ipw2200-firmware-3.1-4.el6.noarch
#Installing rootfiles-8.1-6.1.el6.noarch
#Installing man-pages-3.22-20.el6.noarch
#Installing words-3.0-17.el6.noarch
#*** FINISHED INSTALLING PACKAGES ***[root@qzx tmp]# ^C
[root@qzx tmp]# sed 's$^$#$' /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

[root@qzx tmp]# sed  's@^#[[:space:]]\+@@' /etc/fstab

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

[root@qzx tmp]# echo /etc/init/rc.conf/ | sed -r 's@.*/([^/]+/?$)@\1@'
rc.conf/
[root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@.*/([^/]+/?$)@\1@'
rc.conf

路径名:

[root@qzx tmp]# echo /etc/init/rc.conf | sed -r 's@(.*/)[^/]+/?$@\1@'
 /etc/init/

6、利用sed 取出ifconfig命令中本机的IPv4地址

[root@qzx tmp]# ifconfig |sed -n '2p' |sed -r 's@.*addr:(.*)B.*@\1@'
10.1.253.75

7、统计centos安装光盘中Package目录下的所有rpm文件的
以.分隔倒数第二个字段的重复次数

[root@qzx Packages]# ls *.rpm  |sed -r 's#.*\.(.*)\.rpm#\1#'|sort |uniq -c
      4 i686
    919 noarch
   2283 x86_64

其他高级编辑命令:

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

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

  • g: 从保持空间取出数据覆盖至模式空间

  • G:从保持空间取出内容追加至模式空间

  • x: 把模式空间中的内容与保持空间中的内容进行互换

  • n: 读取匹配到的行的下一行覆盖至模式空间

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

  • d: 删除模式空间中的行

  • D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
    linux sed命令
    保持空间,一次处理不完保存的地方

    实例

    sed -n 'n;p' FILE
    打印偶数行

    sed '1!G;h;$!d' FILE
    倒序排列行 想到于 tac

    sed '$!N;$!D' FILE
    保留后两行

    sed '$!d' FILE
    只保留最后一行

    sed ‘G’ FILE
    加空行

    sed ‘g’ FILE
    显示10个空行

    sed ‘/^$/d;G’ FILE
    删除多余的空行,并在每行后加一个空行

    sed 'n;d' FILE
    [root@qzx ~]# sed 'n;d' qzx.txt
    1
    3
    5
    7
    9

sed -n '1!G;h;$p' FILE
[root@qzx ~]# sed -n '1!G;h;$p' qzx.txt
10
9
8
7
6
4
5
3
2
1

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

(1)
qzxqzx
上一篇 2016-08-10
下一篇 2016-08-10

相关推荐

  • 关于shell变量计算中单中括号与双中括号、单引号与双引号的一些看法

      单中括号是比较基本的变量计算及数值比较的方法,一般情况下已经足够使用;双中括号是扩展的数值比较方法,里面的数值计算也相对来说复杂些。这里我推荐大家平常工作中使用单中括号即可,满足日常的工作,不做运维开发的话,双括号方面涉及不多。   这里我还得提下单括号与双括号,这里也是我经常混淆的地方,其实理解了也就轻松多了。单括号是对一段比较长的…

    学员作品 2016-08-15
  • sed & vim练习

    1、 删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符  2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符 3、在/root/install.log每一行行首增加#号 4、在/etc/fstab文件中不以#开头的行的行首增加#号 5、处理/etc/fstab路径,使用s…

    学员作品 2016-08-10
  • RAID与磁盘管理

    1、创建一个10G分区,并格式为ext4文件系统; [root@localhost ~]# fdisk /dev/sda 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 命令(输入 m 获取帮…

    学员作品 2016-08-22
  • 网卡别名及Bonding实例

    centos6网卡别名 网卡别名: 作用;为同一个网卡设备配置的多个不同ip地址 配置要求: (1)为每个设备别名生成独立的接口配置文件 (2)需关闭NetworkManager服务               &nbs…

    学员作品 2016-09-02
  • 文本处理三剑客:sed篇

    Stream EDitor, 行编辑器 Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。 工作原理: sed是一种流编辑器,如上图所示,它一次处理一行内容,将读入的那行内容送入模式空间,然后根据sed的编辑命令对其进行响应的操作,处理完成后sed默认会把模式空间中的内容打印至标准输出,如果指定了-n选项,则会禁止这种默认的打印行为…

    学员作品 2016-08-10
  • sed和vim的爱恨纠缠

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

    2016-08-10