学习笔记-sed命令

Stream Editor (sed)被称为流编辑器

stream editor
一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上
模式空间
是一个行编辑器

sed命令:

sed [options] "script" FILE....
选项
    -n:静默模式,不输出模式空间中的内容
    -r:扩展的正则表达式
    -f /path/to/sed_script_file: 指定sed脚本文件
    -e 'script  -e 'script' :指定多个编译

script = 地址定界 + 编辑命令

编辑命令:script
    d:删除
    p:打印 一般信息会显示两边
    i \text:在行之上添加
    a \text:在
    r /path/to/somefile:在指定位置把另一个文件的内容插入进来
    r /path/to/somefile:将符合条件的所有行保存至指定的文件中
    = :显示符合条件的行的行号
    s///: 查找条件可以使用模式,但是替换的内容不行

地址定界:
    startline,endline
    1,3
    /part1/,/part2/
    /pattren/

用法:sed [option] 'addr1[,addr2]定界编辑命令' FILE....
用法:sed [option] "addr1[,addr2]定界编辑命令" FILE....   有命令替换时必须使用""号

正则表达式:

基本:
    字符:
        .
        []
        [^]
    次数:
        *
        \?
        \{m,n\}
    锚定
        ^
        $
        \< \b
        \> \b
    分组:
        \(\)
    应用
        \1 \2..
扩展:
    字符
        .
        []
        [^]
            [[:lower:]] [[:punct:]] [[:alnum:]]
    次数:
        *
        ?
        +
        {m,n}
    锚定:
        ^
        $
        \> \b
        \< \b
    或
        a | b
    分组
      ()
    引用:
        \1,\2,.....  

sed ‘地址定界s@查找条件@替换文本@g’
修饰符:
g:global 全局替换
i:ignore-case 不区分字符的大小写

sed高级用法:t, T, D ,P, N, n,H, h, G,g

例子 : 地址定界+d

原文件

[root@localhost ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0

删除13行
[root@localhost ~]# sed '1,3d' /etc/fstab 
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]# 

删除以 “#”开头的行

[root@localhost ~]# sed '/^#/d' /etc/fstab 

UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]#

删除已“ \ ”开头的行

[root@localhost ~]# sed '/^\//d' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
[root@localhost ~]# 
删除第6行 到第一次已“/”结尾的行
sed '6,/^\//d' /etc/fstab
删除第一次已“#”开头的行到第一次已“/”开头的行
sed '/^#/,/^\//d' /etc/fstab

例子 : 地址定界+a/i

在以“/”为首的行之上添加一行hello

[root@localhost ~]# sed '/^\//i \hello' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
hello
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
在以大写字母开头的行之下添加行“first line”在换行添加“second line”

[root@localhost ~]# sed '/^[[:upper:]]/a \first line. \nsecond line' /etc/fstab  

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
first line. 
second line
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
first line. 
second line
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap                    swap    defaults        0 0
first line. 
second line
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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]# 

例子 : 地址定界+r

在以UUID开头的行之后添加文件/etc/issue

[root@localhost ~]# sed '/^UUID/r /etc/issue' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
CentOS release 6.5 (Final)
Kernel \r on an \m

UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
CentOS release 6.5 (Final)
Kernel \r on an \m

UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap                    swap    defaults        0 0
CentOS release 6.5 (Final)
Kernel \r on an \m

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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]#

例子 : 地址定界+w

将以‘/’开头的行保存至文/etc/filetable.txt中

[root@localhost ~]# sed '/^\//w /etc/filetable.txt' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]# cat /etc/filetable.txt 
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]#

将以‘/’开头的行的行号显示出来

[root@localhost ~]# sed -n '/^\//=' /etc/fstab 
16
[root@localhost ~]# 

同时2个操作

先把开头的#删除,再删除空白行

[root@localhost ~]# cat sed.txx 
s@^#@@g
/^$/d

[root@localhost ~]# sed -f sed.txx /etc/fstab 
 /etc/fstab
 Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]# 



方法2:使用-e
[root@localhost ~]# sed -e "s@^#@@g" -e "/^$/d" /etc/fstab 
 /etc/fstab
 Created by anaconda on Sat Sep  1 04:47:41 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=0144d9ef-fde1-4a1b-8209-391df9cc1f66 /                       ext4    defaults        1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot                   ext4    defaults        1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b 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
/dev/myvg1/mylv1    /users          ext4    defaults    0 0
[root@localhost ~]# 

He like his liker
He like his lover
She love her liker
She love her lover

1.删除以前内容中含“l..e”前后一致的行

sed "/\(l..e\).*\1r/d" 1.txt

2.将文件中“l..e”前后一致的行中,最后一个l..e的词首的l换成大写L

[root@localhost ~]# sed "/\(l..e\).*\1r/ s@l\(..er\)@L\1@g" 1.txt
He like his Liker
He like his lover
She love her liker
She love her Lover

练习:
1)替换/etc/inittab文件中”id:3:initdefault:”一行中的数字为5

    sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab         

2)删除/etc/init.d/funcions文件中的空白行

    sed "/^$/d" /etc/init.d/funcions 

3)删除/etc/inittab文件中位于行首的#;

 sed 's@^#@@g' /etc/inittab 

4)删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符。

sed "s@^#[[:space:]]\{1,\}\@@g" /etc/rc.d/rc.sysinit

5)删除/boot/grub/grub.conf文件中行首的空白字符。

sed "s@^[[:space:]]\{1,\}@@g" /boot/grub/grub.conf

6)取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;

   echo /etc/sysconfig/network | sed "s@[^/]\{1,\}/\?$@@" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值