sed(Stream EDitor,流处理编辑器)的使用

sed 文本编辑器 非交互式,流处理编辑器
Stream EDitor,流处理编辑器
--非交互,基于模式匹配过滤及修改文本
--逐行处理,并将结果输出到屏幕
--可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作

sed 命令格式解析
主要用法
--格式1
前置命令|sed [选项] ‘编辑指令’
--格式2
sed [选项] ‘编辑指令’文件... ...

sed 语法格式

sed [选项] '条件指令' 文件

sed '显示指令' 文件
sed '第8行显示指令' 文件


sed有默认输出,加-n进行屏蔽
[root@vh01 script]# sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

从第1行开始,每隔2行打印
[root@vh01 script]# sed -n '1~2p' a.txt
从第2行开始,每隔3行打印
[root@vh01 script]# sed -n '2~3p' a.txt
从第2行开始,打印第2行和后面5行
[root@vh01 script]# sed -n '2,+5p' a.txt


在第二行前面插入xxx
[root@vh01 script]# sed '2i xxx' a.txt
在第二行后面插入xxx
[root@vh01 script]# sed '2a xxx' a.txt
没加条件就是逐行加xxx
[root@vh01 script]# sed 'i xxx' a.txt
[root@vh01 script]# sed 'a xxx' a.txt


删除第3行
[root@vh01 script]# sed '3d' a.txt
没加条件就是全部删除
[root@vh01 script]# sed 'd' a.txt


第5行改为xxxxx
[root@vh01 script]# sed '5c xxxxx' a.txt
没加条件就是全部改成xxxxx
[root@vh01 script]# sed 'c xxxxx' a.txt

替换全部文件的第1列
sed 's/old/new/' 文件
替换全部文件的第2列
sed 's/old/new/2' 文件
替换全部文件的所有列
sed 's/old/new/g' 文件

把old删除
sed 's/old//g' 文件

[root@vh01 script]# sed 's/1990/xxxx/g' a.txt
xxxx 1889 1880 2001
2001 2002 2003 2004
xxxx 2001 xxxx xxxx
1880 2000 xxxx 2000

[root@vh01 script]# sed 's/1990//g' a.txt
1889 1880 2001
2001 2002 2003 2004
2001
1880 2000 2000


sed [选项] '条件指令' 文件
1、sed 的指令
p,a,i,d,c,s

2、条件
行号
/正则/

sed '/abc/d' 文件
sed '/IPADDR=/ c IPADDR=192.168.4.1' /etc/sysconfig/network-scripts/ifcfg-eth0

修改网络IP地址
[root@vh01 script]# sed '/IPADDR/ c IPADDR=192.168.4.10' /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
USERCTL=no
HWADDR=54:52:01:01:01:01
IPADDR=192.168.4.10
NETMASK=255.255.255.0

[root@vh01 script]# sed '/IPADDR/ s/=.*/=1.1.1.1/' /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
USERCTL=no
HWADDR=54:52:01:01:01:01
IPADDR=1.1.1.1
NETMASK=255.255.255.0


修改主机名
[root@vh01 script]# sed '/HOSTNAME/ c HOSTNAME=vh01.tedu.com' /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=vh01.tedu.com

 


[root@vh01 script]# sed 's/\/sbin\/nologin/\/bin\/bash/' c.txt
bob:x:505:505::/home/bob:/bin/bash
harry:x:506:506::/home/harry:/bin/bash
liang:x:507:507::/home/liang:/bin/bash
apache:x:48:48:Apache:/var/www:/bin/bash
qq:x:508:508::/home/qq:/bin/bash
mike:x:509:509::/home/mike:/bin/bash

[root@vh01 script]# sed 's#/sbin/nologin#/bin/bash#' c.txt
bob:x:505:505::/home/bob:/bin/bash
harry:x:506:506::/home/harry:/bin/bash
liang:x:507:507::/home/liang:/bin/bash
apache:x:48:48:Apache:/var/www:/bin/bash
qq:x:508:508::/home/qq:/bin/bash
mike:x:509:509::/home/mike:/bin/bash

修改开机配置
[root@vh01 ~]# sed '/^id/s/[0-9]/5/' /etc/inittab
查看yum源是否可以用
[root@vh01 ~]# yum repolist|sed -n '/repolist:/s/.*://p'|sed s/,//g
3819

查看
sed -n '4,+10p' b.txt 输出第4行及其后面的10行内容
sed -n '^bin' b.txt 输出以bin开头的行
sed -n 'p;n' b.txt 输出奇数行,n表示输入下一行内容。
sed -n 'n;p' b.txt 输出偶数行,n表示输入下一行内容。
sed -n '10,${n;p}' b.txt 输出从第10行至文件末尾的所有内容。
sed -n '$=' b.txt 输出文件的行数

删除
sed '3,5d' b.txt 删除第3至第5行
sed '/xml/d' b.txt 删除所有包括xml的行
sed '/xml/!d' b.txt 删除不包括xml的行,!符合为 取反
sed '/^install/d' b.txt 删除以install开头的行
sed '$d' b.txt 删除文件的最后一行
sed '/^$/d' b.txt 删除所有空行
sed '/^$/{n;/^$/d}' b.txt 删除重复空行,连续两个空行

替换
sed 's/xml/XML/' b.txt 将每行中第1个xml替换为XML
sed 's/xml/XML/3' b.txt 将每行中第3个xml替换为XML
sed 's/xml/XML/g' b.txt 将所有的xml替换为XML
sed 's/xml//g' b.txt 将所有的xml都删除(替换为空)
sed 's/doc/&s/g' b.txt 将doc替换为docs 等同于sed 's/(doc)/\1s/g' b.txt
sed '4,7s/^/#/' b.txt 将第4至第7行注释掉(行首加#)
sed 's/^#an/an/' b.txt 将以#an开头的行注释去掉(去除行首的#)


第一个字母和最后一个字母对调
[root@vh01 script]# sed -r 's/(^.)(.*)(.$)/\3\2\1/' c.txt
dello the worlh
gihao beijinn
ai wo tn


电话号码中间改为xxxx
[root@vh01 script]# sed 's/\(.\{3\}\)\(....\)\(.*\)/\1xxxx\3/g' d.txt
[root@vh01 script]# sed -r 's/(.{3})(....)(.*)/\1xxxx\3/g' d.txt
182xxxx5678
182xxxx5678
182xxxx5678

过滤用户名
[root@vh01 script]# grep -w bash /etc/passwd|sed 's/\(.*\)\(:x.*\)/\1/'
或者
[root@vh01 script]# grep -w bash /etc/passwd|sed -r 's/(.*)(:x.*)/\1/'
或者
[root@vh01 script]# sed -n '/bash$/s/:.*//p' /etc/passwd

过滤用户名以及对应的密码:
[root@vh01 script]# cat m.sh
#!/bin/bash
grep -w bash /etc/passwd > /tmp/user.txt
for i in `cat /tmp/user.txt`
do
echo ${i%%:*} >> /tmp/m.txt
done
for i in `cat /tmp/m.txt`
do
pass=`grep $i /etc/shadow`
pass2=`echo ${pass#*:}`
pass3=`echo ${pass2%%:*}`
echo "$i =====> $pass3" >>/tmp/pass.txt
done

[root@vh01 script]# vim m1.sh
#!/bin/bash
> /tmp/getupwd.log
sed -n '/:\/bin\/bash$/w /tmp/urec.tmp' /etc/passwd
UNUM=`grep -c '.' /tmp/urec.tmp`
while [ ${i:=1} -le $UNUM ]
do
REC=$(sed -n "$ip" /tmp/urec.tmp)
NAME=${UREC%%:*}
PREC=$(sed -n "/^$NAME:/p" /etc/shadow)
PASS=${PREC#*:}
PASS=${PREC%%:*}
echo "$NAME======>>$PASS" >>/tmp/getupwd.log
let i++
done

[root@vh01 script]# vim m2.sh
#!/bin/bash
rm -f /tmp/pass.txt
grep -w bash /etc/passwd > /tmp/user.txt
for i in `cat /tmp/user.txt`
do
name=`echo ${i%%:*}`
pass1=`grep $name /etc/shadow`
pass2=`echo ${pass1#*:}`
pass3=`echo ${pass2%%:*}`
echo "$name =====> $pass3" >>/tmp/pass.txt
done

 

[root@vh01 script]# sed -n 'p;n' b.txt
1
3
5
7
9
[root@vh01 script]# sed -n 'n;p' b.txt
2
4
6
8


sed -r
-r支持扩展正则

-f后面接里面有sed命令的文件
sed -f sed a.txt

在a.txt文件末尾加入/etc/passwd的内容
[root@vh01 script]# sed '$r /etc/passwd' a.txt
在a.txt文件第二行保存为g.txt文件
[root@vh01 script]# sed '2w g.txt' a.txt


sed '/regex/ 指令' 文件
增 a,i
删 d,s
改 c,s
查 p

克隆虚拟机
/usr/local/bin/clone-vm

文件编辑,自动化编辑文件
1、/var/lib/libvirt/images/img
2、/var/lib/libvirt/images/xml

read -p 请输入一个数字 num
1、
qemu-img create -f qcow2 -b new old
2、cp rhel.xml /tmp/clone1.xml
name ,uuid,file,mac address
3、virsh define clone1.xml


"虚拟机编号:" num

sed -i "/<name>/s/r.*</new$num</" /tmp/new.xml

 

posted @ 2021-09-17 13:59  Linux刀客  阅读(216)  评论(0编辑  收藏  举报