主要功能为对文件进行修改处理,可以对文件或标准输入数据流进行增删改查等操作,尤其适用于大文件或有规律的文件,利用此工具,能够帮助我们快捷的在编写 Shell 脚本中得心应手的对文件进行操作。

1、Sed 的适用场景

  • 超大文件处理;
  • 有规律的文本,例如格式化后的日志文件等;
  • 对文件进行批量增加,替换等。

    2、语法

    sed [option] 'address command' [file …]
    image.png

    3、参数:options

  • -n: 静默模式,sed 默认处理完模式空间后将内容输出到标准输出,利用这个这个参数仅显示 script 处理后的结果,不再默认显示模式空间中的内容:sed -n '3p' /etc/passwd (打印 /etc/passwd 的第三行)

在此直接指定地址定界 3,然后 command 为 p 打印输出,由于不想输出 /etc/passwd 的全部内容,因此添加了 - n 选项。
* -e:<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件,可以同时执行多个脚本;
* -f:对制定的文件直接进行sed的command操作;
* -i:直接修改原文件,我们都知道sed默认不对文件进行修改,只是读入一行到模式空间中,处理完成后输出,此参数为也直接修改了源文件;
* -r:支持扩展正则表达式,而不是使用默认的基础正则表达式。类比grep命令的egrep,更加快捷简洁的使用扩展正则表达式,因为有些元字符不用再使用反斜线"\\"了。

4、地址界定:address

地址定界用来指定读入文件的边界或步长。

  • startline,endline:指定读入文件的开始行于结束行号。
  • /regexp/: 利用正则表达式匹配到的行进行处理, ```bash

    例如:打印 /etc/passwd 从以 root 开始的行到 以sync 开始的行

    [root@VM-0-17-centos shell]# sed -n ‘/^root/,/^sync/p’ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync

打印从第3~7行(3<=line<=7)

[root@VM-0-17-centos shell]# sed -n ‘3,7p’ /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

从第3行开始,打印往后4行。等同 ‘3,7p’

[root@VM-0-17-centos shell]# sed -n ‘3,+4p’ /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

打印以root开头的行,从root行往后+3行全部打印

[root@VM-0-17-centos ~]# sed -n “/^root/,+3p” /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin

从第1行开始,每次+2的步长打印,即1、3、5、7…行

[root@VM-0-17-centos shell]# sed -n ‘1~2p’ /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin chrony:x:995:993::/var/lib/chrony:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin mysql:x:1001:1001::/home/mysql:/sbin/nologin saslauth:x:993:76:Saslauthd user:/run/saslauthd:/sbin/nologin

打印10以内以1开始的数,补偿为2,即10以内的奇数

[root@VM-0-17-centos shell]# seq 10 |sed -n ‘1~2p’ 1 3 5 7 9

  1. <a name="xFj55"></a>
  2. #### 5、command:
  3. 具体对指定的文件进行怎样的处理,例如对模式空间内的内容进行增删改查具体的操作
  4. <a name="HqVMw"></a>
  5. ##### 1、增:
  6. - **i:insert**,在制定或匹配到的行前面添加新行内容为 string,`i\string`
  7. - **a:append**,在指定或匹配到的行后面追加新行,内容为 string,`a\string`
  8. ```bash
  9. # 在第一行前面添加###
  10. [root@VM-0-17-centos ~]# sed '1i####' /etc/passwd
  11. ####
  12. root:x:0:0:root:/root:/bin/bash
  13. bin:x:1:1:bin:/bin:/sbin/nologin
  14. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  15. adm:x:3:4:adm:/var/adm:/sbin/nologin
  16. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  17. sync:x:5:0:sync:/sbin:/bin/sync
  18. .........
  19. # 在以bin开头的行后追加####
  20. [root@VM-0-17-centos ~]# sed "/^bin/a####" /etc/passwd
  21. root:x:0:0:root:/root:/bin/bash
  22. bin:x:1:1:bin:/bin:/sbin/nologin
  23. ####
  24. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  25. adm:x:3:4:adm:/var/adm:/sbin/nologin
  26. .........

2、删
  • d:delete,删除符合地址定界条件的的行(不会修改源文件,如果添加-i会修改源文件)

    # 删除以zhangl开头的行
    [root@VM-0-17-centos ~]# sed '/^zhangl/d' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    ......
    

    3、改
  • s:s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被模式匹配到的字符串 ,如果修饰符为 g, 则为全部替换。 ```bash

    替换文件中第一个root为ROOT

    [root@VM-0-17-centos ~]# sed ‘s/root/ROOT/‘ /etc/passwd ROOT:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

替换文件中所有root为ROOT

[root@VM-0-17-centos ~]# sed ‘s/root/ROOT/g’ /etc/passwd ROOT:x:0:0:ROOT:/ROOT:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nolog

替换文件中”x:数字”为”x:x”

[root@VM-0-17-centos ~]# sed ‘s/x:[0-9]/x:x/g’ /etc/passwd root:x:x:0:root:/root:/bin/bash bin:x:x:1:bin:/bin:/sbin/nologin daemon:x:x:2:daemon:/sbin:/sbin/nologin adm:x:x:4:adm:/var/adm:/sbin/nologin lp:x:x:7:lp:/var/spool/lpd:/sbin/nologin sync:x:x:0:sync:/sbin:/bin/sync

<a name="kOhEo"></a>
##### 4、查

   - **p:print**,默认 sed 对模式空间内的处理完毕后,将输出的结果输出在标准输出,添加 p 命令,相当于输出了原文,又一次输出了模式匹配处理后的内容。
```bash
# -n打印第三行,加入-n参数后,不输出全部内容
[root@VM-0-17-centos ~]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

sed 常用于修改文件,如果为查询文件可以利用 grep,因为 grep 检索文件效率最高,如果为格式化输出建议使用 awk;