30_Linux基础-shell编程-sed

:点击此处或下方 以展开或折叠目录

一. sed的整行替换 c

1
2
3
4
5
6
7
#示例:sed的整行替换  c
[root@cPen_A 10]# cp /etc/sysconfig/selinux .
[root@cPen_A 10]# sed -i '/^SELINUX=/c SELINUX=disabled' selinux
[root@cPen_A 10]# cp /etc/ssh/sshd_config .
[root@cPen_A 10]# sed -i '/^#Port/c Port 2233' sshd_config
[root@cPen_A 10]# cat sshd_config |grep Port
Port 2233


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#注:对文件的修改  用sed比较好

[root@cPen_A 10]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 . #注:网卡配置文件
[root@cPen_A 10]# vim ifcfg-ens33
BOOTPROTO="none" #注:none 静态配置ip地址 dhcp动态获得ip
NAME="ens33" #注:网卡连接的名字
UUID="831f1350-14c2-46db-bf53-1937c5feb8f5" #注:网卡的设备编号的唯一值
DEVICE="ens33" #注:网卡设备的名字
ONBOOT="yes" #注:开机的时候是否激活 yes表示激活启动 no禁用
IPADDR="192.168.0.38" #注:ip地址
NETMASK=255.255.255.0 #注:子网掩码
GATEWAY=192.168.0.1 #注:默认网关 路由器的接口地址
DNS1=192.168.0.1 #注:首选dns服务器
DNS2=114.114.114.114 #注:备用dns服务器

#示例:将ip地址替换,使用sed 整行替换

#注:光猫/调制解调器(modem)

需求分析:

  1. read或者位置变量

  2. 修改配置文件 sed (整行替换 或 局部替换)

  3. ip合法判断 --> 正则


二. sed的w命令 写入文件

1
2
3
4
5
6
7
8
sed的w命令  写入文件
#示例:把以#开头的行 不写到文件里
[root@cPen_A 10]# sed '/^#/!w a.txt' selinux
[root@cPen_A 10]# cat selinux |sed '/^#/!w abc.txt'
[root@cPen_A 10]# cat a.txt
SELINUX=disabled
SELINUXTYPE=targeted


三. sed的替换 -->核心功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@cPen_A 10]# sed -i 's/xiaomi/redmi/' phone.txt 	#注:替换每一行的第1个xiaomi替换为redmi
[root@cPen_A 10]# sed -i 's/vivo/nokia/2' phone.txt #注:替换每一行的第2个vivo替换为nokia
[root@cPen_A 10]# sed -i 's/oppo/meizu/g' phone.txt #注:每一行所有的oppo替换为meizu
[root@cPen_A 10]# sed -i 's/xiaomi/redmi/2g' phone.txt #注:替换每一行的第2个后所有xiaomi全部替换为redmi

[root@cPen_A 10]# sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33 #注:查找替换 (局部替换)
[root@cPen_A 10]# sed -i '8 s/192.168.0.1/192.168.0.2/' ifcfg-ens33 #注:根据 行号替换 (局部替换)
[root@cPen_A 10]# sed -i '8 s/GATEWAY.*/GATEWAY=192.168.0.2/' ifcfg-ens33 #注:整行替换

#示例:把所有apple删除 --> 删除部分字符串
[root@cPen_A 10]# sed -i 's/apple//g' phone.txt #注:拿空的去替换它

\n 换行
\t tab
[root@cPen_A 10]# sed -i 's/s/\t/g' phone.txt

---------------------------------------------------------
[root@cPen_A 10]# sed -i '1c sanchuang' /etc/hostname

[root@cPen_A 10]# sed -i '3,5s/^/#/' phone.txt #注:3-5行加注释

[root@cPen_A 10]# sed -i '3,5s/$/ sanchuang/' phone.txt #注:3-5行 末尾加sanchuang

[root@cPen_A 10]# sed -i '/^DNS2/ s/^/#/' ifcfg-ens33 #注:注释
#DNS2=114.114.114.114

1
2
#示例:
[root@cPen_A 10]# sed -i 's#/sbin/nologin#/bin/bash#' passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#示例:
[root@cPen_A 10]# cat c.txt
0.0.0.0
1.1.1.1
2.2.2.2
[root@cPen_A 10]# cat c.txt|sed -n 's/$/:80/;H;${x;s/\n/,/2g;p}'

0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

h H Copy/append pattern space to hold space.

g G Copy/append hold space to pattern space.

x Exchange the contents of the hold and pattern spaces.
---------------------------------------------------------------------
[root@localhost 10]# cat c.txt |tr '\n' ','|sed -n 's/,/:80&/g;p'|awk -F, 'OFS=","{print $1,$2,$3}'
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80


1
2
sed的命令中&的用法
&用于表示替换命令中的匹配模式

(正则) --》对应一个标签–》分组

从左到右 1开始

\3 引用第3个分组(标签)

1
2
3
示例:
[root@cPen_A 10]# echo aaa bbb 123456 ccc | sed -r 's/([a-z]+) ([a-z]+) ([0-9]+) ([a-z]+)/\3/'
123456

四. 模式空间(pattern space)和暂存空间(hold space)相关的命令

模式空间(pattern space)和暂存空间(hold space)相关的命令:

n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。

N 读入下一行,追加到模式空间行后面,此时模式空间有两行。

h 把模式空间里的行拷贝到暂存空间。

H 把模式空间里的行追加到暂存空间。

g 用暂存空间的内容替换模式空间的行。

G 把暂存空间的内容追加到模式空间的行后。

x 将暂存空间的内容于模式空间里的当前行互换。

! 对所选行以外的所有行应用命令。

http://blog.csdn.net/itsenlin/article/details/21129405


五. 练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
练习:
1.编写一个修改ip地址的脚本
提醒用户输入ip、子网掩码、网关、dns服务器地址
直接修改网卡配置文件,然后刷新服务让输入的ip地址信息生效
需要检查输入ip地址是否合法,不能输入空的内容或者字母,如果ip地址不合法或者输入空内容、字母都给予提醒
提醒:空的内容包括回车和空格,可以是多个空格

需求分析:
1.read或者位置变量
2.修改配置文件 sed
3.ip合法判断--》正则

2.请将所有的非root用户的uid后面加一个0,gid前面加一个1
复制/etc/passwd 到当前目录下操作

3给下列含有大写字母的行,在数字后追加sanchuang --》sed
   abcd6Sdd9dde
   islHishbxld
   goBke8fji
   daa5nshXxge


4.自己编辑一个文件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
5.sed取出/etc/passwd文件的第一列
6.sed将PATH环境变量中的冒号换成换行
7.sed将PATH环境变量斜杠/换成斜杠\
8.sed修改SELINUX配置文件从开启(enforcing)变成禁用(disabled)
/etc/sysconfig/selinux
9.去掉/etc/passwd文件中第二个字段的x
10.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址
只显示ip add的ip地址
11.复制/etc/ssh/sshd_config 到当前目录,然后操作。将sshd_config里的端口号修改为8899