linux三剑客之sed

sed简介

sed:Stream EDitor, 流编辑器、也叫行编辑器。  
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),  
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。  
然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。  
这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。  

sed的功能  :
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

sed 工具的使用

sed用法:
    sed [option]...'script' inputfile....  
常用选项:  
    -n: 不输出模式中的内容至屏幕,不自动打印
    -e: 多点编辑
    -f: /path/somefile: 从指定文件中读取编辑脚本
    -r: 支持使用扩展正则表达式
    -i: 编辑原文件,也可以使用-i.bak,先备份后做修改。

例子:

-e: 执行多个命令,也就是上述中的多点编辑

[root@centos6 ~/gawktest]#sed -e 's/brown/green/; s/dog/cat/' file
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.  

#用''来,从而不需要使用分号,不过从开始以'来编写结尾的时候也需要用'来结尾
[root@centos6 ~/gawktest]#sed -e '
> s/brown/green/
> s/dog/cat/' file
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.

-f: 从指定文件中读取编辑脚本,如果有大量要处理的命令可以事先存放到一个文本文件里面比较方便。后续可以使用sed -f filename file

[root@centos6 ~/gawktest]#cat script1 
s/brown/green/
s/fox/elephant/
s/over/cobbler/
s/dog/cat/
[root@centos6 ~/gawktest]#sed -f script1 file
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.
The quick green elephant jumps cobbler the lazy cat.

地址定界

1、不给地址: 默认对全文进行处理
2、单地址:

2、1 #:指定的行,$: 最后一行  
        2、2 /pattern/: 被此处模式所能够匹配到的每一行

3、地址范围:

3、1  #,#  
        3、2  #,+#  
        3、3  /pat1/,/pat2/  
        3、4  #,/pat1/

4、~:步进
1~2奇数行

[root@centos6 ~/gawktest]#seq 1 10 | sed '1~2p'
1
1
2
3
3
4
5
5
6
7
7
8
9
9
10

4、2 2~2偶数行

[root@centos6 ~/gawktest]#seq 1 10 | sed '2~2p'
1
2
2
3
4
4
5
6
6
7
8
8
9
10
10

编辑命令

d 删除模式空间匹配的行

]#sed '/^UUID/d' /etc/fstab   删除以UUID开头的行

p 打印当前模式空间内容,追加到默认输出之后,一般配合-n选项来

[root@centos6 ~/gawktest]#sed -n '/r..t/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

a [ \ ] text 在指定行后面追加文本,支持使用\n实现多行追加

[root@centos6 ~/gawktest]#sed  '/^UUID/a \ hello sed' /etc/fstab
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
 hello sed
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
 hello sed
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
 hello sed
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0
 hello sed

i [ \ ] text 在指定行前面插入文本

[root@centos6 ~/gawktest]#sed '/^UUID/i \head hello' /etc/fstab 
head hello
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
head hello
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
head hello
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
head hello
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

c [ \ ] text 替换行为单行或多行文本

[root@centos6 ~/gawktest]#sed '/^UUID/c \uuid is 0' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# 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 is 0
uuid is 0
uuid is 0
uuid is 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

w /path/to/somefile 保存模式空间匹配到的行至指定文件中

[root@centos6 ~/gawktest]#sed '/^UUID/w /tmp/fstab' /etc/fstab 
[root@centos6 ~/gawktest]#cat /tmp/fstab
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

r /path/from 读取指定文件的文本至模式空间中匹配到的行后

[root@centos6 ~/gawktest]#sed '6r /etc/issue' /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
CentOS release 6.10 (Final)
Kernel \r on an \m
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info=

= 为模式空间中匹配的行打印行号

[root@centos6 ~/gawktest]#sed '/^UUID/=' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Jul 19 09:43:42 2018
#
# 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
#
9
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
10
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
11
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
12
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0

! 模式空间中匹配行取反处理

[root@centos6 ~/gawktest]#sed '/^UUID/!=' /etc/fstab 
1

2
#
3
# /etc/fstab
4
# Created by anaconda on Thu Jul 19 09:43:42 2018
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
#
UUID=9d14df54-a9ce-4c41-bdbe-dc9d851d11d1 /                       ext4    defaults        1 1
UUID=eb942a01-ecc7-40f4-ac87-8a1dbb07841e /boot                   ext4    defaults        1 2
UUID=e49f600c-7f88-4e84-aba2-bb85296647ad /data                   ext4    defaults        1 2
UUID=b92b7eda-51dc-4e22-a0fc-09f72a542158 swap                    swap    defaults        0 0
13
tmpfs                   /dev/shm                tmpfs   defaults        0 0
14
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
15
sysfs                   /sys                    sysfs   defaults        0 0
16
proc                    /proc                   proc    defaults        0 0

高级编辑命令

h:把模式空间中的内容覆盖至保持空间中;
        H:把模式空间中的内容追加至保持空间中;
        g:从保持空间取出数据覆盖至模式空间;
        G:从保持空间取出内容追加至模式空间;
        x:把模式空间中的内容与保持空间中的内容进行互换;
        n:读取匹配到的行的下一行至模式空间;
        N:追加匹配到的行的下一行至模式空间;
        d:删除模式空间中的行;
        D:删除多行模式空间中的所有行;
        sed -n 'n;p' file:显示偶数行
        sed '1!G;h;$!d' file:逆向显示文件内容
        sed '$!N;$!D' file:取文件后两行
        sed '$!d' file:取出文件最后一行
        sed 'G' file:在每一行后面加一行空白行
        sed '/^$/d;G' file:
        sed 'n;d' file:显示奇数行
        sed -n '1!G;h;$p' file:逆向显示文件中的每一行
相关文章
相关标签/搜索