sed介绍
sed是一种流编辑器,一行一行的处理文件内容,正在处理的内容存放在缓冲区中,然后按照选项进行输出。
执行过程:
1一次读取一行数据
2根据我们提供的规则来匹配相关的数据
3按照命令进行修改流中的数据
4结果输出
5重复以上的步骤
sed选项:ani(记住)
-a 在当前行下面插入文件
-n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
-i 编辑文件内容
-e 执行多个sed指令
-f 运行脚本
-i.bak 编辑的同时创建.bak的备份
-r 使用扩展的正则表达式
命令:icpdws(牢记)
i:在当前行的上面插入文件
c:将选定的行改为新的指定的文本
p:打印
d:删除
w:另存
s:查找
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
D 删除\n之前的内容
P 打印\n之前的内容
sed替换标记:
数字:表明新的文本将替换第几处模式匹配的地方
g:替换所有
\1:子串匹配的标记
下面是一些sed命令的例子
s用来替换匹配到的第一个字符
[root@break ~]#
[root@break ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@break ~]# sed 's/root/du/' /etc/passwd | head -1
du:x:0:0:root:/root:/bin/bash
全面替换标记g
[root@break ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@break ~]# sed 's/root/du/g' /etc/passwd | head -1
du:x:0:0:du:/du:/bin/bash
改变定界符,从/变成#
[root@break ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@break ~]# sed 's#/bin/bash#/bin/nologin#' /etc/passwd | head -1
root:x:0:0:root:/root:/bin/nologin
[root@break ~]# sed 's/\/bin\/bash/\/bin\/nologin/' /etc/passwd | head -2
qqqq
root:x:0:0:root:/root:/bin/nologin
按照行进行查找和替换,第二行内容的替换
[root@break ~]# sed '2s/bin/du/' /etc/passwd | head -2
root:x:0:0:root:/root:/bin/bash
du:x:1:1:bin:/bin:/sbin/nologin
[root@break ~]# head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
多行替换,从第二行到最后一行
[root@break ~]# sed '2,$s/x/ssss/' /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
bin:ssss:1:1:bin:/bin:/sbin/nologin
daemon:ssss:2:2:daemon:/sbin:/sbin/nologin
[root@break ~]# head -3 /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
删除2到4行的内容
[root@break ~]# sed '2,4d' /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@break ~]# head -3 /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
删除包括x的所有行
[root@break ~]# sed '/s/d' /etc/passwd
qqqq
[root@break ~]# head -2 /etc/passwd
qqqq
root:x:0:0:root:/root:/bin/bash
行前插入
[root@break ~]# echo "world" | sed 'i\hello'
hello
world
行后插入
[root@break ~]# echo "world" | sed 'a\hello'
world
hello
文末追加内容
[root@break ~]# sed '$a\nihao' a.txt
hello world
/root
nihao
文中插入内容
[root@break ~]# sed '1,2a\nihao' a.txt
hello world
nihao
/root
nihao
[root@break ~]# cat a.txt
hello world
/root
中间内容的修改
[root@break ~]# sed '2,$c\nihao' a.txt
hello world
nihao
[root@break ~]# cat a.txt
hello world
/root
文档结尾内容的修改
[root@break ~]# sed '2,$c\192.169.1.1' a.txt
hello world
192.169.1.1
打印并直接输出文档的内容
[root@break ~]# sed -n '/root/w a.txt' /etc/passwd
[root@break ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
对原文件进行修改
[root@break ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@break ~]# sed -i 's/root/du/' a.txt
[root@break ~]# cat a.txt
du:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/du:/sbin/nologin
[root@break ~]# sed -i 's/IPADDR=192.168.1.63/IPADDR=192.168.1.64/' /etc/sysconfig/network-scripts/ifcfg-ens33
[root@break ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=8852230c-17a0-4eb6-bad7-9efa9606080f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.64
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
IPV6_PRIVACY=no
cut
-b:仅显示行中指定范围的字节数;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
N-:从第N个字节、字符、字段到结尾;
N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。
[root@break ~]# cut -c1-5 /etc/passwd | head -5
qqqq
root:
bin:x
daemo
adm:x
[root@break ~]# cut -c-3 /etc/passwd | head -5
qqq
roo
bin
dae
adm
[root@break ~]# cut -c3- /etc/passwd | head -5
qq
ot:x:0:0:root:/root:/bin/bash
n:x:1:1:bin:/bin:/sbin/nologin
emon:x:2:2:daemon:/sbin:/sbin/nologin
m:x:3:4:adm:/var/adm:/sbin/nologin