1、命令格式:
格式1:
#sed [选项] ‘编辑指令’ 文件列表(多个文件间空格间隔)
格式2:
前置命令 | sed [选项] ‘编辑指令’
2、常见选项
1)-n
——屏蔽默认输出,仅输出符合条件的文本
2)-i
——直接修改文件内容
正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改。若希望直接修改文件内容,可添加选项 -i
3)-e
——一起执行多个处理动作
如果不使用 -e ,也可以用分号来隔离多个操作
4)-f
——使用sed脚本
5)-r
——启用拓展的正则表达式
3、编辑指令:
1)其中,“编辑指令”用来实现过滤操作,由“[定址符]处理动作”组成;
2)而“定址符”用来定义需要操作的文本,由“[地址1,[地址2]]组成,地址1为起始位置,地址2为结束位置;
3)未指定“定址符”时,默认处理所有文本;
4、处理动作(除非加上选项 –i ,否则不会修改原文件)
1)p
——打印行
(1)输出inittab第18行
[root@localhost ~]# sed -n '18p' /etc/inittab id:5:initdefault: [root@localhost ~]#
(2)输出inittab的45到50行
[root@localhost ~]# sed -n '45,50p' /etc/inittab 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 [root@localhost ~]#
(3)输出文件的4到7行和仅输出第4行和第7行
[root@localhost ~]# cat -n /etc/passwd | sed -n '4,7p' 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 [root@localhost ~]# [root@localhost ~]# cat -n /etc/passwd | sed -n '4p;7p' 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown [root@localhost ~]#
(4)输出第2行及之后的3行
[root@localhost ~]# cat -n /etc/passwd | sed -n '2,+3p' 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 ~]#
(5)输出以mail开头的行
——第一条命令之所以不成功是因为 命令cat 用 -n 参数输出行号后是以行号开头了;所以去掉 -n 参数
[root@localhost ~]# cat -n /etc/passwd | sed -n '/^mail/p' [root@localhost ~]# [root@localhost ~]# cat /etc/passwd | sed -n '/^mail/p' mail:x:8:12:mail:/var/spool/mail:/sbin/nologin mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin [root@localhost ~]#
(6)输出奇数行或偶数行
—— n表示读取下一行;产生隔行操作的效果。
奇数行:p;n
偶数行:n;p
[root@localhost ~]# cat -n /etc/passwd | sed -n 'p;n' 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
[root@localhost ~]# cat -n /etc/passwd | sed -n 'n;p' 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
(7)输出40行到最后一行
[root@localhost ~]# cat -n /etc/passwd | sed -n '35,$p' 35 named:x:25:25:Named:/var/named:/sbin/nologin 36 apache:x:48:48:Apache:/var/www:/sbin/nologin 37 squid:x:23:23::/var/spool/squid:/sbin/nologin [root@localhost ~]#
(8)输出文本的行数
[root@localhost ~]# cat -n /etc/passwd | sed -n '$=' 37 [root@localhost ~]#
2)d(除非加上选项–I ,否则不会修改原文件)
——删除行
(1)删除5到8行
[root@localhost ~]# cat -n /etc/passwd | sed '5,8d' 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 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 news:x:9:13:news:/etc/news:
(2)从包含mail行开始删,删到3的倍数为止
[root@localhost ~]# cat -n /etc/passwd | sed '/mail/,~3d'
处理前:
8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 news:x:9:13:news:/etc/news: 11 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 12 operator:x:11:0:operator:/root:/sbin/nologin 13 games:x:12:100:games:/usr/games:/sbin/nologin 14 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
处理后:
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 13 games:x:12:100:games:/usr/games:/sbin/nologin 14 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 15 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 16 nobody:x:99:99:Nobody:/:/sbin/nologin 17 nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
(3)从第5行开始删,删到4的倍数为止
[root@localhost ~]# cat -n /etc/passwd | sed '5,~4d' 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 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 news:x:9:13:news:/etc/news:
(4)读m行,删掉这m行中的第n行。我也晕~
# cat -n passwd | sed 'n~md'
最典型的应用就是删掉奇数行或偶数行
[root@localhost ~]# cat -n /etc/passwd | sed '1~2d' 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 news:x:9:13:news:/etc/news:
[root@localhost ~]# cat -n /etc/passwd | sed '2~2d' 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
(5)删掉空行
[root@localhost ~]# cat -n /etc/passwd | sed '/^$/d'
3)s(除非加上选项–I ,否则不会修改原文件)
——替换
(1)格式:
#sed [选项] ‘[定址符]s/源数据/新数据/选项’ 文件名
#前置命令 | sed [选项] ‘[定址符]s/源数据/新数据/选项’
定址符:
——是可选项,
源数据:
可以是文件已有的单词,也可以是正则表达式
(2)只替换开头单词
[root@localhost ~]# cat -n /etc/passwd | sed 's/root/huanglianfeng/g' 1 huanglianfeng:x:0:0:huanglianfeng:/huanglianfeng:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
(3)将每行的第一个bin替换成大写BIN
[root@localhost ~]# cat -n /etc/passwd | sed 's/bin/BIN/g' 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
(4)正则表达式的应用
删除所有的数字:
[root@localhost ~]# cat -n /etc/passwd | sed 's/[0-9]//g' root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x:::daemon:/sbin:/sbin/nologin
说一下: s和d都能起到删除的作用;但它们应用的地方时u区别的。
d是以行为单位删除的,比如是删掉某一行或某几行;
s是删掉某些字符,其实质是将它们替换成空字符,达到删除的效果
删掉所有数字和字母:
[root@localhost ~]# cat -n /etc/passwd | sed 's/[0-Z]//g' :::::/:// :::::/:// :::::/:// ::::://:// :::::///://
(5)指定修改某一行
修改第2行
[root@localhost ~]# cat -n /etc/passwd | sed '2s/bin/BIN/g' 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
(6)替换数据
源数据里面有 / 号,需要转义;每个都要
[root@localhost ~]# cat -n /etc/passwd | sed 's/\/sbin\/nologin/\/bin\/bash/' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/bin/bash 4 adm:x:3:4:adm:/var/adm:/bin/bash 5 lp:x:4:7:lp:/var/spool/lpd:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync
(7)() 后项引用,保存已匹配的数据
修改IP地址网段
[root@localhost ~]# sed -r '/^IPADDR/s/192.168.10.(.*)/172.16.16.\1/' /etc/sysconfig/network-scripts/ifcfg-eth0 # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth0 BOOTPROTO=static HWADDR=00:0c:29:9b:2a:c7 ONBOOT=yes NETMASK=255.255.255.0 IPADDR=172.16.16.2 #GATEWAY=192.168.10.254 TYPE=Ethernet USERCTL=no IPV6INIT=no PEERDNS=yes [root@localhost ~]
转载于:https://blog.51cto.com/huanglianfeng/1367797