sed命令
一、sed的定义
1、sed:是一个文本字符串流进行过滤和转换(替换和删除)的编辑器
2、sed的使用
[root@xiaoliu lianxi]# cat fan.txt
wo ai chi fan ming you
fan ming you fan ming you
[root@xiaoliu lianxi]# sed -i '/^fan/ s/fan/liu/g' fan.txt
[root@xiaoliu lianxi]# cat fan.txt
wo ai chi fan ming you
liu ming you liu ming you
[root@xiaoliu lianxi]# sed -i 's/you//g' fan.txt
[root@xiaoliu lianxi]# cat fan.txt
wo ai chi fan ming
liu ming liu ming
二、sed里的两种空间
1、pattern space:加工车间
2、hold space:临时仓库
三、sed的语法命令格式
1、三种命令格式:
1、sed [选项] sed编辑命令 输入文件
2、shell 命令 | sed [选项] sed编辑命令
3、sed [选项] -f sed脚本文件 输入文件
四、sed的常用选项
1、-n 只显示匹配处理的行(否则会输出所有)
#输出第8行
[root@localhost 76]# sed -n '8p' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
#输出第一行和最后一行
[root@localhost 76]# sed -n '1p;$p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mengmeng2:x:1014:1014::/home/mengmeng2:/bin/bash
2、-i 直接在文件中进行修改,而不是输出到屏幕
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
fan ming you fan ming you
[root@localhost 76]# sed -i '/^fan/ s/fan/liu/g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
liu ming you liu ming you
[root@localhost 76]#
[root@localhost 76]# sed -i 's/you//g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming
liu ming liu ming
3、-r 支持扩展正则----》(+ | {} )
五、sed里常用的编辑命令
1、p命令的练习:
#不连续的输出1,3,5行的内容,;表示命令连接符
[root@liuhongjie lianxi]# sed -n '1p;3p;5p;' passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#从第1行到第5行的内容
[root@liuhongjie lianxi]# sed -n '1,5p' 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
#步长是2,每次增加2
[root@liuhongjie lianxi]# cat -n /etc/passwd|sed -n '1~2p'
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
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
15 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
…………
[root@liuhongjie lianxi]# cat -n /etc/passwd|sed -n '2~2p'
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
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 dbus:x:81:81:System message bus:/:/sbin/nologin
16 systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
18 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
20 sssd:x:996:993:User for sssd:/:/sbin/nologin
22 liuhongjie:x:1001:1001::/home/liuhongjie:/bin/bash
24 caohx:x:1004:1004::/home/caohx:/bin/bash
2、shell的变量在sed里面的使用,用双引号引起来
[root@xiaoliu lianxi]# num1=5
[root@xiaoliu lianxi]# num2=15
[root@xiaoliu lianxi]# sed -n "${num1}p;${num2}p" /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
3、a和i操作
在行首和行尾添加内容,使用替换操作,使用^和$元字符
4、s操作
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
fan ming you fan ming you
[root@localhost 76]# sed -i '/^fan/ s/fan/liu/g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
liu ming you liu ming you
[root@localhost 76]#
[root@localhost 76]# sed -i 's/you//g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming
liu ming liu ming
5、模式匹配
[root@xiaoliu lianxi]# cat cat.txt
i have a "fat" big "cat" 4376
i have a "fat" big "cat" 7887
i have a "fat" big "cat" 456
i have a "fat" big "cat" 123
i have a "fat" big "cat" 789
[root@xiaoliu lianxi]# sed -i -r 's/\<[0-9]{3}\>/&0/g' cat.txt
[root@xiaoliu lianxi]# cat cat.txt
i have a "fat" big "cat" 4376
i have a "fat" big "cat" 7887
i have a "fat" big "cat" 4560
i have a "fat" big "cat" 1230
i have a "fat" big "cat" 7890
6、sed里面的分组标签
[root@localhost 76]# echo aaa bbb 1234 |sed -r 's/([a-z]+) ([a-z]+) ([0-9]+)/\3 \2 \1/'
1234 bbb aaa
[root@localhost 76]#
[root@localhost 76]# echo aaa bbb 1234 |awk '{print $3,$2,$1}'
1234 bbb aaa
六、练习
练习1、
复制/etc/hosts文件到当前目录下,然后进行操作
1.在每行前面加一个字符串sanchuang
2.自己编辑一个文件test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
1、[root@xiaoliu lianxi]# cat test.txt |sed -n 'N;N;s/\n/:80,/g;s/$/:80/p'
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
练习2、
1.sed取出/etc/passwd文件的第一列
sed -n '1p' /etc/passwd
2.sed将PATH环境变量中的冒号换成换行 ->可以将PATH变量的内容重定向到一个文件里,例如path.txt
sed -i 's/:/\n/g' path.txt
3.sed将PATH环境变量斜杠/换成斜杠\
sed -i 's/\//\\/g' path.txt
4.sed修改SELINUX配置文件从开启(enforcing)变成禁用(disabled)
/etc/sysconfig/selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'
5.去掉/etc/passwd文件中第二个字段的x
sed -i 's/x//g' passwd
6.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes
sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33
7.只显示ip add的ip地址
ip add|sed -nr '/ens33$/ s#([a-z ]+) (([0-9]+\.){3}[0-9]+/[0-9]{2}) (.*)#\2#p'
8.复制/etc/ssh/sshd_config到当前目录下,修改里面的端口号修改为8899,将#Port 22 配置修改为Port 8899 要求去掉前面的#号,将22修改为8899
sed -i '/^#Port/ c Port 8899' sshd_config
9.给下列含有大写字母的行,在大写字母后追加数字2022 --》sed
abcdSdddde
islHishbxld
goBkefji
daanshXxge
不要直接对上面的源文件进行操作,建议复制到当前文件夹里进行
sed -ir 's/[A-Z]/&2022/g' test.txt
答案:
1、[root@liuhongjie lianxi]# sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
2、[root@liuhongjie lianxi]# cat path.txt
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root
[root@liuhongjie lianxi]# sed -i 's/:/\n/g' path.txt
[root@liuhongjie lianxi]# cat path.txt
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root
3、[root@liuhongjie lianxi]# cat path.txt
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root
[root@liuhongjie lianxi]# sed -i 's/\//\\/g' path.txt
[root@liuhongjie lianxi]# cat path.txt
\usr\local\sbin:\usr\local\bin:\usr\sbin:\usr\bin:\root
4、[root@xiaoliu lianxi]# sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
[root@xiaoliu lianxi]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
5、sed -i 's/x//g' passwd
6、[root@xiaoliu lianxi]# sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33
[root@xiaoliu lianxi]# cat ifcfg-ens33
BOOTPROTO=none #设置网卡静态配置ip地址,none静态配置(手工指向ip)DHCP表示虚拟机动态获得ip地址
NAME=ens33 #网卡的设备名为ens33
DEVICE=ens33 #网卡的设备名为ens33
ONBOOT=no #开机自启动网卡--》自动激活网卡
7、[root@liuhongjie lianxi]# ip add|sed -nr '/ens33$/ s#([a-z ]+) (([0-9]+\.){3}[0-9]+/[0-9]{2}) (.*)#\2#p'
192.168.243.128/24
8、sed -i '/^#Port/ c Port 8899' sshd_config
9、[root@liuhongjie lianxi]# cat test.txt
abcdSdddde
islHishbxld
goBkefji
daanshXxge
[root@liuhongjie lianxi]# sed -ir 's/[A-Z]/&2022/g' test.txt
[root@liuhongjie lianxi]# cat test.txt
abcdS2022dddde
islH2022ishbxld
goB2022kefji
daanshX2022xge