正则表达式三剑客之——sed命令

一、sed是什么

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

二、sed的原理

但是使用sed命令对文本进行操作之前必须要知道它的原理,它是怎么工作中的,这个非常重要,否则会影响操作的结果的正确性

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

三、sed的常用操作选项

sed常用选项

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

sed常用命令动作

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

四、如何使用sed

sed [options] script filename

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

script是指需要对输入执行的一个或者多个操作指令,一般需要用单引号括起来,这样可以避免shell对特殊字符的处理。sed会依次读取输入文件的每一行到缓存中并应用script中指定的操作指令,因此而带来的变化并不会影响最初的文件(除非option加了-i参数)。

每条操作指令由pattern和procedure两部分组成,顾名思义,pattern是匹配的规则,一般为用’/'分隔的正则表达式(也有可能是行号,具体参见Sed命令地址匹配问题总结),而procedure则是一连串编辑命令(action)。

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

五、具体操作

1、打印输出

单引号里不指定任何操作它会把文件从第一行打印到最后一行

[root@server ~]# sed '' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

如果使用‘p’它会重复显示每一行,因为它默认会打印一遍,然后又得到你的指定是打印,它就又打印一遍

[root@server ~]# sed 'p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

所以如果不想看到重复信息,前面用-n选项

[root@server ~]# sed -n 'p' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

打印第二行

[root@server ~]# sed -n '2p' passwd.txt 
bin:x:1:1:bin:/bin:/sbin/nologin

打印1-4行

[root@server ~]# sed -n '1,4p' passwd.txt 
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

打印最后一行,打印第一行用‘1p’,不要用‘^p’

[root@server ~]# sed -n '$p' passwd.txt 
operator:x:11:0:operator:/root:/sbin/nologin

打印有root的行

[root@server ~]# sed -n '/root/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

打印以root开头的行

[root@server ~]# sed -n '/^root/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash

不打印有nologin的行

[root@server ~]# sed -n '/nologin/!p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

打印root所在行的行号和内容,多个操作中间加分号隔开

[root@server ~]# sed -n '/root/=;/root/p' passwd.txt 
1
root:x:0:0:root:/root:/bin/bash
10
operator:x:11:0:operator:/root:/sbin/nologin

打印以root开头或者以shutdown开头的行,使用了扩展元字符“|”,前面要加-r

[root@server ~]# sed -nr '/^root|^shutdown/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

打印sync所在的行到第8行的内容,如果后面的数字小于前面内容的行号会显示错误

[root@server ~]# sed -n '/sync/,8p' passwd.txt 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

注意:通常-n和‘p’一起使用

2、增加内容

在第2行上面插入hello world

[root@server ~]# sed '2ihello world' passwd.txt 
root:x:0:0:root:/root:/bin/bash
hello world
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
operator:x:11:0:operator:/root:/sbin/nologin

在每一行的上面插入hello world(如果不指定行号或范围的话)

[root@server ~]# sed 'ihello world' passwd.txt 
hello world
root:x:0:0:root:/root:/bin/bash
hello world
bin:x:1:1:bin:/bin:/sbin/nologin
hello world
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello world
adm:x:3:4:adm:/var/adm:/sbin/nologin
hello world
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
hello world
sync:x:5:0:sync:/sbin:/bin/sync
hello world
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
hello world
halt:x:7:0:halt:/sbin:/sbin/halt
hello world
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
hello world
operator:x:11:0:operator:/root:/sbin/nologin

在第3行的上面插入hello换行再插入world

[root@server ~]# sed '3ihello\nworld' passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hello
world
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
operator:x:11:0:operator:/root:/sbin/nologin

在第1行下面插入999

[root@server ~]# sed '1a999' passwd.txt 
root:x:0:0:root:/root:/bin/bash
999
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
operator:x:11:0:operator:/root:/sbin/nologin

在最后一行下面插入999

[root@server ~]# sed '$a999' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin
999

在第2-第4行下面插入999,意思是2,3,4行每行下面都插入999

[root@server ~]# sed '2,4a999' passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
999
daemon:x:2:2:daemon:/sbin:/sbin/nologin
999
adm:x:3:4:adm:/var/adm:/sbin/nologin
999
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
operator:x:11:0:operator:/root:/sbin/nologin

3、修改内容

把以root开头的行整行替换为kgc

[root@server ~]# sed '/^root/ckgc' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

把1-5行内容全部替换为kgc

[root@server ~]# sed '1,5ckgc' passwd.txt 
kgc
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
operator:x:11:0:operator:/root:/sbin/nologin

4、删除内容

删除第一行

[root@server ~]# sed '1d' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

删除1-4行

[root@server ~]# sed '1,4d' passwd.txt 
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
operator:x:11:0:operator:/root:/sbin/nologin

删除有nologin的行

[root@server ~]# sed '/nologin/d' passwd.txt 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

不指定就是全部删除

[root@server ~]# sed 'd' passwd.txt 
[root@server ~]# 

5、搜索替换

格式:sed 选项 ‘s/搜索的内容/替换的内容/动作’
搜索root所在行把第一个出现的root换成ROOT

[root@server ~]# sed -n 's/root/ROOT/p' passwd.txt 
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

搜索root所在行,把所有出现的root都替换成ROOT

[root@server ~]# sed -n 's/root/ROOT/gp' passwd.txt 
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

把1-5行的开头都插入#号

[root@server ~]# sed  -n '1,5s/^/#/gp' /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

为了后面实验将这条应用到源文件

[root@server ~]# sed  -i '1,5s/^/#/g' passwd.txt 

把#号开头的行去掉#号

[root@server ~]# sed -n 's/^#//gp' passwd.txt 
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

把#号开头的行的#号换成hello world

[root@server ~]# sed -n 's/^#/hello world /gp' passwd.txt 
hello world root:x:0:0:root:/root:/bin/bash
hello world bin:x:1:1:bin:/bin:/sbin/nologin
hello world daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello world adm:x:3:4:adm:/var/adm:/sbin/nologin
hello world lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

把所有/sbin/nologin换成kgc,/需要转义

[root@server ~]# sed -n 's/\/sbin\/nologin/kgc/gp' passwd.txt 
#bin:x:1:1:bin:/bin:kgc
#daemon:x:2:2:daemon:/sbin:kgc
#adm:x:3:4:adm:/var/adm:kgc
#lp:x:4:7:lp:/var/spool/lpd:kgc
mail:x:8:12:mail:/var/spool/mail:kgc
operator:x:11:0:operator:/root:kgc

另一种不需要转义的方式就是自己定义分隔符为@

[root@server ~]# sed -n '10s@/sbin/nologin@kgc@gp' passwd.txt 
operator:x:11:0:operator:/root:kgc

我们只想搜索以sync开头的行并且前面加#号,那就需要保留sync,那就要把搜索的字符写成&就会被保留不会一起替换,观察不加&的区别

[root@server ~]# sed -n 's/^sync/#&/gp' passwd.txt 
#sync:x:5:0:sync:/sbin:/bin/sync
[root@server ~]# sed -n 's/^sync/#/gp' passwd.txt 
#:x:5:0:sync:/sbin:/bin/sync

6、插入其他文件内容

我们还可以将其他文件插入到当前文件当中处理
将/etc/hosts文件插入到第三行后面

[root@server ~]# sed '3r /etc/hosts' passwd.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#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
#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
operator:x:11:0:operator:/root:/sbin/nologin

如果不指定的话就在每一行后面都插入

[root@server ~]# sed 'r /etc/hosts' passwd.txt 
#root:x:0:0:root:/root:/bin/bash
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#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
#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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
sync:x:5:0:sync:/sbin:/bin/sync
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
halt:x:7:0:halt:/sbin:/sbin/halt
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
operator:x:11:0:operator:/root:/sbin/nologin
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

在结尾插入/etc/hosts文件内容

[root@server ~]# sed '$r /etc/hosts' passwd.txt 
#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
operator:x:11:0:operator:/root:/sbin/nologin
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

7、保存到文件

把1-5行内容写入到22.txt文件

[root@server ~]# sed -n '1,5w 22.txt' passwd.txt 	
[root@server ~]# cat -n 22.txt 
     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

8、多次编辑

在有多个操作的时候需要加-e选项,中间可以以分号间隔,也可以每一次都加-e

[root@server ~]# sed -ne '1p;5p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@server ~]# sed -ne '1p' -ne '5p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server ~]# sed -ne '/root/=' -ne '/root/p' passwd.txt 
1
root:x:0:0:root:/root:/bin/bash
10
operator:x:11:0:operator:/root:/sbin/nologin

9、搭配正则表达式

这里用了扩展元字符“|”前面需要加-r选项

[root@server ~]# sed -r '/^#|^$/d' /etc/ssh/sshd_config 
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/libexec/openssh/sftp-server

10、显示行号

sed用=来显示行号

[root@server ~]# sed = passwd.txt 
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

11、直接修改源文件

修改源文件的本质其实就是将-n换成-i,-i不要和‘p’同时使用,-n和-i也不要一起使用

[root@server ~]# sed -n '1,3s/^/#/gp' passwd.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server ~]# sed -i '1,3s/^/#/g' passwd.txt 
[root@server ~]# cat passwd.txt 
#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
operator:x:11:0:operator:/root:/sbin/nologin

12、使用sed脚本

如果我们要对一个文件进行多个操作,为了方便和效率,可以将要执行的sed命令逐行写进sed脚本里面,然后用sed -f来指定脚本名对指定的文件进行操作

[root@server ~]# vim test.sh

#!/bin/sed -f
s/root/ROOT/g
s/^#//g
s/\/sbin\/nologin/kgc/g

[root@server ~]# sed -f test.sh passwd.txt 
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:kgc
daemon:x:2:2:daemon:/sbin:kgc
adm:x:3:4:adm:/var/adm:kgc
lp:x:4:7:lp:/var/spool/lpd:kgc
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:kgc
operator:x:11:0:operator:/ROOT:kgc

注意:

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

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/107642686