sed命令的详细指南

sed命令的详细指南options 指的是 sed 的命令行参数 比较有限 这个后面会说明

大家好,欢迎来到IT知识分享网。

sed命令的详细指南

一、sed是什么

sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

二、sed的原理

在使用sed命令对文本进行操作之前,必须要了解它的工作原理。这非常重要,否则会影响操作结果的正确性。

  1. 读入新的一行内容到缓存空间;
  2. 从指定的操作指令中取出第一条指令,判断是否匹配pattern;
  3. 如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
  4. 如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
  5. 当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
  6. 当所有行都处理完之后,结束。

三、sed的常用操作选项

sed [选项] '操作' 参数 sed [选项] -f scriptfile 参数 

3.1 简版理解

选项 含义
-e 进行多次编辑
-n 取消默认输出
-f 指定sed文件名
-i 直接在源文件中修改
-r 使用扩展正则表达式

3.2 sed常用命令动作

命令动作 含义
p 打印输出
d 删除指定行
i 在指定行之前插入内容
a 在指定行后面插入内容
c 替换指定行所有内容
s 搜索替换

四、如何使用sed

sed [options] script filename 

或者

sed [option]... 'script;script;...' [input file...] 

options指的是sed的命令行参数,比较有限,这个后面会说明。script是指需要对输入执行的一个或者多个操作指令,一般需要用单引号括起来,这样可以避免shell对特殊字符的处理。sed会依次读取输入文件的每一行到缓存中并应用script中指定的操作指令,因此而带来的变化并不会影响最初的文件(除非option加了-i参数)。每条操作指令由pattern和procedure两部分组成,顾名思义,pattern是匹配的规则,一般为用’/’分隔的正则表达式(也有可能是行号,具体参见Sed命令地址匹配问题总结),而procedure则是一连串编辑命令(action)。

总结: sed命令+选项 ‘定位+动作+内容’ 文件名

五、具体操作

5.1 打印输出

[root@localhost ~]# cat -n /etc/passwd > /tmp/passwd [root@localhost ~]# sed '' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ... [root@localhost ~]# sed 'p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 2 bin:x:1:1:bin:/bin:/sbin/nologin ... [root@localhost ~]# sed -n 'p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 

image-20240724171858489

image-20240724171957732

image-20240724172047661

5.1.1 显示范围

[root@localhost ~]# sed -n '1p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash [root@localhost ~]# sed -n '1,3p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@localhost ~]# sed -n '1p;3p;5p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@localhost ~]# sed -n '3,+3p' /tmp/passwd 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 

image-20240724172520252

5.1.2 奇数偶数行

[root@localhost ~]# sed -n '1~2p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin [root@localhost ~]# sed -n '2~2p' /tmp/passwd 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]# sed -n '2~3p' /tmp/passwd 2 bin:x:1:1:bin:/bin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 8 halt:x:7:0:halt:/sbin:/sbin/halt 11 games:x:12:100:games:/usr/games:/sbin/nologin 

image-20240724172909009

image-20240724172959871

image-20240724173044690

5.1.3 匹配特定模式

[root@localhost ~]# sed -n '/root/p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]# sed -n '/bash$/p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 44 shengjie:x:1000:1000:shengjie:/home/shengjie:/bin/bash 47 user1:x:1001:1003::/home/user1:/bin/bash [root@localhost ~]# sed -n '/s...x/p' /tmp/passwd 28 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin 32 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin 35 sssd:x:991:985:User for sssd:/:/sbin/nologin 40 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 42 postfix:x:89:89::/var/spool/postfix:/sbin/nologin [root@localhost ~]# sed -n '/[0-9]/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 ... [root@localhost ~]# sed -n '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash 

image-20240724173156274

image-20240724173231663

image-20240724173339045

image-20240724173525088

image-20240724173626323

5.2 删除操作

[root@localhost ~]# sed 'd' /tmp/passwd [root@localhost ~]# sed '1d' /tmp/passwd 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@localhost ~]# sed '1,4d' /tmp/passwd 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt [root@localhost ~]# sed '/nologin/d' /tmp/passwd 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 8 halt:x:7:0:halt:/sbin:/sbin/halt 44 shengjie:x:1000:1000:shengjie:/home/shengjie:/bin/bash 47 user1:x:1001:1003::/home/user1:/bin/bash [root@localhost ~]# echo '' >> /tmp/passwd [root@localhost ~]# echo '' >> /tmp/passwd [root@localhost ~]# sed '/^$/d' /tmp/passwd [root@localhost ~]# sed '/^#/d' /tmp/passwd [root@localhost ~]# sed '/^#/d;/^$/d' /tmp/passwd 

image-20240724174420778

image-20240724174448760

image-20240724181948087

image-20240724182115255

image-20240724182147779

image-20240724182224319

5.3 替换操作

s/pattern/string/修饰符 

支持使用其它分隔符,可以是其它形式:s@@@,s 替换修饰符:

  • g 行内全局替换
  • p 显示替换成功的行
  • w /PATH/FILE 将替换成功的行保存至文件中
  • I,i 忽略大小写
[root@localhost ~]# sed '/^root/c\kgc' /etc/passwd kgc bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]# sed '/root/c\kgc' /etc/passwd kgc 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 kgc [root@localhost ~]# sed 'c\kgc' /etc/passwd kgc kgc kgc 

image-20240725032631250

-n和-i不要联用

-n 选项取消了默认输出,意味着只有通过明确指示的 `p` 命令才会打印内容。 -i 选项直接修改文件。 当 `-n` 和 `p` 一起使用时,`sed` 只会打印被 `p` 指示的内容。如果没有匹配到任何行或 `p` 命令执行不正确,结果是没有任何内容被输出到文件中,导致文件内容被清空。 

这里没有真的改变文件内容,只是输出到屏幕,如果想要真的替换,需要用-i选项,建议用-i之前对原文件进行备份,或者:

[root@localhost ~]# sed -i.bak 'p' /etc/hosts 

image-20240725032104140

5.4 搜索替换

[root@localhost ~]# sed 's/root/ROOT/' /tmp/passwd 1 ROOT:x:0:0:root:/root:/bin/bash [root@localhost ~]# sed -n 's/root/ROOT/gp' /tmp/passwd 1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash 10 operator:x:11:0:operator:/ROOT:/sbin/nologin [root@localhost ~]# sed -n 's/o/O/2p' /tmp/passwd 1 roOt:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nolOgin [root@localhost ~]# sed -n 's/root//gp' /tmp/passwd 1 :x:0:0::/:/bin/bash 10 operator:x:11:0:operator:/:/sbin/nologin [root@localhost ~]# sed -n '1,5s/^/#/gp' /tmp/passwd # 1 root:x:0:0:root:/root:/bin/bash # 2 bin:x:1:1:bin:/bin:/sbin/nologin # 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 4 adm:x:3:4:adm:/var/adm:/sbin/nologin # 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@localhost ~]# sed -n 's/\/sbin\/nologin/kgc/gp' /tmp/passwd 2 bin:x:1:1:bin:/bin:kgc 3 daemon:x:2:2:daemon:/sbin:kgc 4 adm:x:3:4:adm:/var/adm:kgc 5 lp:x:4:7:lp:/var/spool/lpd:kgc 9 mail:x:8:12:mail:/var/spool/mail:kgc 10 operator:x:11:0:operator:/root:kgc [root@localhost ~]# sed -n 's@/sbin/nologin@kgc@gp' /tmp/passwd 2 bin:x:1:1:bin:/bin:kgc 3 daemon:x:2:2:daemon:/sbin:kgc 4 adm:x:3:4:adm:/var/adm:kgc 5 lp:x:4:7:lp:/var/spool/lpd:kgc 9 mail:x:8:12:mail:/var/spool/mail:kgc 10 operator:x:11:0:operator:/root:kgc 

image-20240725033158449

image-20240725033217765

image-20240725033348415

image-20240725033726615

image-20240725033824433

image-20240725033920979

image-20240725034127803

image-20240725035357887

5.5 插入文件

[root@localhost ~]# sed '3r /etc/hosts' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 
[root@localhost ~]# sed '/2/r /etc/hosts' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
[root@localhost ~]# sed '$r /etc/hosts' /tmp/passwd 47 user1:x:1001:1003::/home/user1:/bin/bash 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 

image-20240725040341118

5.6 另存为到文件

使用w指令将当前编辑的文件内容另存到其他文件中,如果目标文件已存在,则会将目标文件的内容覆盖。

[root@localhost ~]# sed 'w /tmp/hosts' /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 

image-20240725042255430

5.7 同时编辑

[root@localhost ~]# sed -n -e '1p' -e '3p' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@server ~]# sed -ne '1p' -ne '5p' /etc/passwd root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 

sed命令的详细指南

5.8 分组操作

[root@localhost ~]# sed '/root/{s/root/ROOT/;s/x/X/g}' /tmp/passwd 1 ROOT:X:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:X:11:0:operator:/ROOT:/sbin/nologin [root@localhost ~]# sed -ne '/root/{s/root/ROOT/;s/x/X/g}' -ne '1,10p' /tmp/passwd 1 ROOT:X:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:X:11:0:operator:/ROOT:/sbin/nologin 

img

5.9 从 ifconfig 命令提取 IP 地址

[root@localhost ~]# ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+) .*/\1/p' 

image-20240725042004706

5.10 读取完退出

[root@localhost ~]# sed '3q' /tmp/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.11 sed脚本

有时我们需要对文件进行的增、删、改比较多,但是一条一条修改比较麻烦,所以对于指令比较多的情况,我们可以先将所有的sed指令写入一个文本文件中,然后通过sed的-f选项读取该指令文件即可实现多指令操作。

#!/bin/sed -f 1c hello world 2{ 
    p s/b/B/ } /root/{ 
    s/x/H/ s/root/ROOT/ } 

注意:

  • sed脚本文件第一行要声明#!/bin/sed -f 不要加单引号。
  • 每行的最后不能有空格等多余字符。
  • #号开头为注释。
  • 一行有多个命令时用分号隔开。

5.12 sed的高级应用

5.12.1 -r匹配正则

[root@localhost ~]# sed -r s/^[\t]*/#/ /etc/hosts.bak # 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 

image-20240811030107781

5.12.2 结合变量使用

[root@localhost ~]# word=1111 [root@localhost ~]# sed '1a$word' /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 $word ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost ~]# sed "1a$word" /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 1111 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost ~]# sed '1a'"$word" /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 1111 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost ~]# sed 1a$word /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 1111 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost ~]# sed '$a'"$word" /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 1111 [root@localhost ~]# sed "\$a$word" /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 1111 

image-20240811030219064

image-20240811030236123

5.13 扩展或作业

5.13.1 sed 直接操作文件示例生产案例

案例1

需求:需要将ens33网络接口的IP地址修改为192.168.78.22

sed -i 's/^IPADDR=.*/IPADDR=192.168.78.22/' /etc/sysconfig/network-scripts/ifcfg-ens33 
案例2

需求:需要将Apache的监听地址修改为192.168.78.22,端口修改为8080

修改监听地址

sudo sed -i 's/^Listen .*/Listen 192.168.78.22:8080/' /etc/httpd/conf/httpd.conf 

修改 ServerName

sed -i 's/^ServerName .*/ServerName 192.168.78.22:8080/' /etc/httpd/conf/httpd.conf 

5.13.2 编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)

案例3 脚本
[root@localhost ~]# vim local_only_ftp.sh #!/bin/bash # 指定样本文件路径、配置文件路径 SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf" CONFIG="/etc/vsftpd/vsftpd.conf" # 备份原来的配置文件, 若不存在则使用 cp 命令进行备份 [ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整, 覆盖现有文件 sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG # 确保配置文件中包含 'listen' 选项 grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG # 启动 vsftpd 服务, 并设为开机后自动运行 systemctl restart vsftpd systemctl enable vsftpd [root@localhost ~]# chmod +x local_only_ftp.sh 

image-20240811030506953

通过上述脚本,可以实现以下功能:

  1. 检查并备份现有的vsftpd配置文件。
  2. 禁用匿名用户访问。
  3. 允许本地用户访问并开启写入权限。
  4. 确保vsftpd服务配置中包含‘listen’选项。
  5. 重启vsftpd服务并设置为开机自动运行。
    CONFIG.bak” ] && cp $CONFIG $CONFIG.bak

基于样本配置进行调整, 覆盖现有文件

确保配置文件中包含 ‘listen’ 选项

grep “listen” C O N F I G ∣ ∣ s e d − i ′ CONFIG || sed -i ‘ CONFIG∣∣sedialisten=YES’ $CONFIG

启动 vsftpd 服务, 并设为开机后自动运行

[root@localhost ~]# chmod +x local_only_ftp.sh

 [外链图片转存中...(img-iflivVCk-23)] 通过上述脚本,可以实现以下功能: 1. 检查并备份现有的vsftpd配置文件。 2. 禁用匿名用户访问。 3. 允许本地用户访问并开启写入权限。 4. 确保vsftpd服务配置中包含‘listen’选项。 5. 重启vsftpd服务并设置为开机自动运行。 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121266.html

(0)
上一篇 2025-10-24 17:45
下一篇 2025-10-24 18:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信