主要功能为对文件进行修改处理,可以对文件或标准输入数据流进行增删改查等操作,尤其适用于大文件或有规律的文件,利用此工具,能够帮助我们快捷的在编写 Shell 脚本中得心应手的对文件进行操作。
1、Sed 的适用场景
- 超大文件处理;
- 有规律的文本,例如格式化后的日志文件等;
-
2、语法
sed [option] 'address command' [file …]
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
<a name="xFj55"></a>#### 5、command:具体对指定的文件进行怎样的处理,例如对模式空间内的内容进行增删改查具体的操作<a name="HqVMw"></a>##### 1、增:- **i:insert**,在制定或匹配到的行前面添加新行内容为 string,`i\string`- **a:append**,在指定或匹配到的行后面追加新行,内容为 string,`a\string````bash# 在第一行前面添加###[root@VM-0-17-centos ~]# sed '1i####' /etc/passwd####root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/sync.........# 在以bin开头的行后追加####[root@VM-0-17-centos ~]# sed "/^bin/a####" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin####daemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin.........
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;
