sed语法格式
1. sed ‘{定位}指令' 文件
2.命令 | sed '指令'
#sed 'p' 文件 #显示文件的内容
#sed -n 'p' 文件
如何定位(man sed)
1.行号
#sed -n '1p' 文件
#sed -n '3p' 文件
#sed -n '1~2p' 文件
#sed -n '1,2p' 文件
2.正则
#sed -n '/IPADDR/p' 文件
#sed -n '\cIPADDRc' 文件
#sed '/\/bin\/bash/p' 文件
#sed '\c/bin/bashcp' 文件
#sed '\#/bin/bash#p' 文件
SED的操作指令:
1.增加
#sed '2a XXX' 文件 #追加append
#sed '2i YYY' 文件 #插入insert
2.删除
#sed '2d' 文件 #删除第2行
#sed '/IPADDR/d' 文件
3.修改
#sed '2c XXX' 文件 #change行
#sed 's/旧/新/' 文件 #替换,替换1个
#sed 's/旧/新/g' 文件 #替换所有
脚本自动安装软件,修改配置,启动服务
#vim test.sh
#!/bin/bash
yum -y install vsftpd
sed -i '$a chroot_local_user=YES' /etc/vsftpd/vsftpd.conf
service vsftpd start
chkconfig vsftpd on
sed 's/旧/新/' 文件
sed 's# # #' 文件
sed 's, , ,' 文件
sed的n指令{next}读取下一行
sed的s替换特殊用法
#sed 's/abc/&d/' 文件
把abc替换为abcd
#sed 's/doc/&s/' 文件
把doc替换为docs
#sed 's/hmtl/<&>/' 文件
#sed '/关键词/s/旧/新/' 文件
正则:正则的保留
abctabcuabciabcoabc
abctcbauabcicbaocba
1.基本正则
\(abc\)t \ 1 u\ 1i\1o\1
\(abc\)t\(cba\)u\1i\2o\2
2.扩展正则
(abc)t\1u\1i\1o\1
(abc)t(cba)u\1i\2o\2
[root@stu ~]# cat a.txt
192.168.0.1
192.168.0.2
192.168.0.8
[root@stu ~]# sed -r 's/192.168.0.([0-9])/172.16.0.\1/' a.txt
172.16.0.1
172.16.0.2
172.16.0.8
#sed -r '/IPADDR/s#([0-9]{1,3}.){3}([0-9]{1,3})#176.137.4.\2#' /etc/sysconfig/network-scripts/ifcfg-eth0
# sed -r '/IPADDR/s#[0-9].*.([0-9]{1,3})#176.137.4.\1#' /etc/sysconfig/network-scripts/ifcfg-eth0
删除每行的第2个和最后一个字符
hello the word
ni hao beijing
hello
#sed -r 's/^(.).(.*).$ /\1\2/' txt
将每行的第1个和最后一个字符互换位置
#sed 's/^(.)(.*)(.)$/\3\2\1/' txt
sed其他功能:
r读入其他文件
w另存为
#sed '3r b.txt' a.txt
#sed '1,3w cc.txt' a.txt
##################################################
[root@svr5 data]# cat /etc/passwd | wc -l
35
[root@svr5 data]# sed -n '$=' /etc/passwd
35
##################################################
hello the word
ni hao beijing
hello
将第一行,复制到第2行后面
#sed '1h;2G' a.txt
将第一行,剪切并替换最后一行
#sed '1h;1d;$g' a.txt
h 将数据复制到粘贴板[覆盖]
H 将数据赋值到粘贴板[追加]
g 将粘贴板的数据粘贴回来[覆盖]
G 将粘贴板的数据粘贴回来[追加]
综合案例:过滤用户名称以及对应的密码
#!/bin/bash
rm -rf user.tmp
line=`sed -n '/bash$/p' /etc/passwd`
for i in $line
do
echo ${i%%:*} >>user.tmp
done
for j in `cat user.tmp`
do
pass1=`grep $j /etc/shadow`
pass2=`echo ${pass1#*:}`
pass=`echo ${pass2%%:*}`
echo "$j---->$pass"
done
++++++++++++++++++++++++++++++++++++++
版本二
#!/bin/bash
#user=`grep "/bin/bash" /etc/passwd |cut -d: -f1`
user=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $user
do
pass=$(grep $i /etc/shadow |sed 's/.*:$6\$//;s/:.*//')
echo "$i 密码是:$pass"
do
1. sed ‘{定位}指令' 文件
2.命令 | sed '指令'
#sed 'p' 文件 #显示文件的内容
#sed -n 'p' 文件
如何定位(man sed)
1.行号
#sed -n '1p' 文件
#sed -n '3p' 文件
#sed -n '1~2p' 文件
#sed -n '1,2p' 文件
2.正则
#sed -n '/IPADDR/p' 文件
#sed -n '\cIPADDRc' 文件
#sed '/\/bin\/bash/p' 文件
#sed '\c/bin/bashcp' 文件
#sed '\#/bin/bash#p' 文件
#sed '$p' 文件
注意:sed -ni 会把文件删空变成空文件
SED的操作指令:
1.增加
#sed '2a XXX' 文件 #追加append
#sed '2i YYY' 文件 #插入insert
2.删除
#sed '2d' 文件 #删除第2行
#sed '/IPADDR/d' 文件
3.修改
#sed '2c XXX' 文件 #change行
#sed 's/旧/新/' 文件 #替换,替换1个
#sed 's/旧/新/g' 文件 #替换所有
脚本自动安装软件,修改配置,启动服务
#vim test.sh
#!/bin/bash
yum -y install vsftpd
sed -i '$a chroot_local_user=YES' /etc/vsftpd/vsftpd.conf
service vsftpd start
chkconfig vsftpd on
sed 's/旧/新/' 文件
sed 's# # #' 文件
sed 's, , ,' 文件
sed的n指令{next}读取下一行
sed的s替换特殊用法
#sed 's/abc/&d/' 文件
把abc替换为abcd
#sed 's/doc/&s/' 文件
把doc替换为docs
#sed 's/hmtl/<&>/' 文件
#sed '/关键词/s/旧/新/' 文件
#sed '/关键词/s#旧#新#' 文件
开头第一个和最后一个替换
正则:正则的保留
abctabcuabciabcoabc
abctcbauabcicbaocba
1.基本正则
\(abc\)t \ 1 u\ 1i\1o\1
\(abc\)t\(cba\)u\1i\2o\2
2.扩展正则
(abc)t\1u\1i\1o\1
(abc)t(cba)u\1i\2o\2
[root@stu ~]# cat a.txt
192.168.0.1
192.168.0.2
192.168.0.8
[root@stu ~]# sed -r 's/192.168.0.([0-9])/172.16.0.\1/' a.txt
172.16.0.1
172.16.0.2
172.16.0.8
#sed -r '/IPADDR/s#([0-9]{1,3}.){3}([0-9]{1,3})#176.137.4.\2#' /etc/sysconfig/network-scripts/ifcfg-eth0
# sed -r '/IPADDR/s#[0-9].*.([0-9]{1,3})#176.137.4.\1#' /etc/sysconfig/network-scripts/ifcfg-eth0
删除每行的第2个和最后一个字符
hello the word
ni hao beijing
hello
#sed -r 's/^(.).(.*).$ /\1\2/' txt
将每行的第1个和最后一个字符互换位置
#sed 's/^(.)(.*)(.)$/\3\2\1/' txt
sed其他功能:
r读入其他文件
w另存为
#sed '3r b.txt' a.txt
#sed '1,3w cc.txt' a.txt
##################################################
[root@svr5 data]# cat /etc/passwd | wc -l
35
[root@svr5 data]# sed -n '$=' /etc/passwd
35
##################################################
hello the word
ni hao beijing
hello
将第一行,复制到第2行后面
#sed '1h;2G' a.txt
将第一行,剪切并替换最后一行
#sed '1h;1d;$g' a.txt
h 将数据复制到粘贴板[覆盖]
H 将数据赋值到粘贴板[追加]
g 将粘贴板的数据粘贴回来[覆盖]
G 将粘贴板的数据粘贴回来[追加]
综合案例:过滤用户名称以及对应的密码
#!/bin/bash
rm -rf user.tmp
line=`sed -n '/bash$/p' /etc/passwd`
for i in $line
do
echo ${i%%:*} >>user.tmp
done
for j in `cat user.tmp`
do
pass1=`grep $j /etc/shadow`
pass2=`echo ${pass1#*:}`
pass=`echo ${pass2%%:*}`
echo "$j---->$pass"
done
++++++++++++++++++++++++++++++++++++++
版本二
#!/bin/bash
#user=`grep "/bin/bash" /etc/passwd |cut -d: -f1`
user=`sed -n '/bash$/s/:.*//p' /etc/passwd`
for i in $user
do
pass=$(grep $i /etc/shadow |sed 's/.*:$6\$//;s/:.*//')
echo "$i 密码是:$pass"
do