sed命令
一、sed编辑器
- sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中
sed工作过程
- 读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
二、sed命令
1、命令格式
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
2、常用选项
选项 | 说明 |
---|---|
-n | 关闭自动打印,可以与p命令一起使用完成输出 |
-i | 真正修改编辑文件 |
-i.bak | 修改之前,先备份原文件,在原文件后加上bak(bak没有限制,可以自定义) |
-r | 使用扩展正则表达式 |
-e | 多点编辑,表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f | 从指定文件中读取编辑脚本 |
3、常用操作
选项 | 说明 |
---|---|
a | 增加,在下面插入内容,需要真正修改时,要加-i选项 |
i | 前面插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;其通常与“-n”选项一起使用 =: 打印行号 |
q | 退出 |
d | 删除,删除选定的行 |
s | 替换,替换指定字符 |
y | 字符转换,转换前后的字符长度必须相同 |
w | 保存模式匹配的行至指定文件 |
r | 读取指定文件的文本至模式空间中匹配的行后 |
#在第5行下方插入
[root@localhost ~]#seq 10|sed '5axxxx'
1
2
3
4
5
xxxx
6
7
8
9
10
#在第5行上方插入
[root@localhost ~]#seq 10|sed '5ixxxx'
1
2
3
4
xxxx
5
6
7
8
9
10
#替换第5行内容
[root@localhost ~]#seq 10|sed '5cxxxx'
1
2
3
4
xxxx
6
7
8
9
10
#打印第6行
[root@localhost ~]#seq 10 |sed -n '6p'
6
#删除第5行
[root@localhost ~]#seq 10 |sed '5d'
1
2
3
4
6
7
8
9
10
[root@localhost ~]#cat test
aaaaa
bbbbb
ccccc
ddddd
#将test文件中的第2行写入xx.txt文件
[root@localhost ~]#sed -n '2wxx.txt' test
[root@localhost ~]#cat xx.txt
bbbbb
#将/etc/issue文件中的内容当做参数写入到test文件的第3行下面
[root@localhost ~]#cat test|sed '3r /etc/issue'
aaaaa
bbbbb
ccccc
\S
Kernel \r on an \m
ddddd
4、搜索替代
4.1 格式
-
s/旧内容/新内容/修饰符
旧内容:可以用正则表达式
新内容:一定是固定的字符串(要修改的内容是一定的,不能用正则表达式)
修饰符 | 说明 |
---|---|
g | 行内全局替换 |
p | 显示替换成功的行 |
i | 忽略大小写 |
w | 将替换成功的行保存至文件中 |
#查看/etc/selinux/config文件
[root@localhost ~]#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=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
#将/etc/selinux/config文件中的SELINUX=enforcing替换为SELINUX=disable
[root@localhost ~]#sed -i.text 's/SELINUX=enforcing/SELINUX=disable/' /etc/selinux/config
#查看/etc/selinux/config文件
[root@localhost ~]#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=disable
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
#不用进配置文件,修改httpd端口
[root@localhost ~]#sed -ir 's/Listen 80/Listen 1128/' /etc/httpd/conf/httpd.conf
[root@localhost ~]#
[root@localhost ~]#grep 1128 /etc/httpd/conf/httpd.conf
Listen 1128
4.2 指代变量—&
[root@localhost ~]#grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#将文件中的r..t替换为r..tmak(&:指代找到的旧内容)
[root@localhost ~]#sed 's/r..t/&mak/g' /etc/passwd
rootmak:x:0:0:rootmak:/rootmak:/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:/rootmak:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftmakp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
4.3 分组替换
格式
- s//代表查找替换 ()代表分组 \1 代表留下的组
#分组替换,()表示分的组,\1或者\2或者\3表示留下来的组
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'
123
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\2/'
abc
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1\2/'
123abc
#可以指定分组输出的顺序
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\2\1/'
abc123
[root@localhost ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.11 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::53e9:a034:7de9:f2b9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:42:0c:18 txqueuelen 1000 (Ethernet)
RX packets 855038 bytes 1201177005 (1.1 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 277864 bytes 17105648 (16.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#提取本机ip地址(分组替换)
[root@localhost ~]#ifconfig ens33|sed -nr '2s/.*inet (.*) netmask.*/\1/p'
192.168.10.11
4.4 变量
#匹配/etc/passwd文件中的root字符
[root@localhost ~]#name=root
[root@localhost ~]#sed -nr '/$name/p' /etc/passw
[root@localhost ~]#sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#sed -nr '/'$name'/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#弱引用不能识别变量,需要使用强引用或者将变量名也用弱引号标记
5、脚本格式
'地址+命令'组成
1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
#:#表示数字,指定的行,
$:表示最后一行
/pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
n,n #从n行到第n行,(如:2,6 从第2行到第6行)
n,+n #从n行到+n行,(如:2,+6 表示从2行到第8行)
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间的行
(如: n,/pat/ 表示从n号行为开始找到 pat为止; /pat/,n 表示找到n个pat为止)
4. 步进:~
1~2 表示奇数行(从1开始,间隔为2)
2~2 表示偶数行(从2开始,间隔为2)
#打印2至6行
[root@localhost ~]#seq 10|sed -n '2,6p'
2
3
4
5
6
#打印2至8行(2+6)
[root@localhost ~]#seq 10|sed -n '2,+6p'
2
3
4
5
6
7
8
[root@localhost ~]#
#打印奇数行
[root@localhost ~]#seq 10|sed -n '1~2p'
1
3
5
7
9
#打印偶数行
[root@localhost ~]#seq 10|sed -n '2~2p'
2
4
6
8
10