sed 文本编辑器(vim)
增,删,改,查
特点:流处理器【逐行处理的流处理器】html
各类编辑器notepad,notepad++,word,atom
vim,vi,gedit,sedmysql
非交互的(sed)【手动修改vim】
1.模版虚拟机【img镜像文件,xml的配置文件】面试
2.克隆【新的img镜像,xml】
name
uuid
mac
disk file正则表达式
vim abc.xmlsql
3.clone-vm7
sed改的vim
yum -y install httpd
set /etc/httpd/conf/httpd.conf 【若是用vim,须要手动修改】
systemctl start httpdbash
vim a.txt 2g 大文件会down死
sed a.txt 2g
notepad a.txt 2gless
语法格式dom
sed 选项 ‘定位指令’ 文件
sed -n "3p" /etc/passwd //3p 打印第三行//【sed有个默认输出的功能】-n屏蔽默认输出
[root@sanpao1 ~]# vim 1.txt
[root@sanpao1 ~]# sed "2p" 1.txt
1
2
2
3
4编辑器
1.定位
用行号定位、
vim 1.txt
1
2
3
4
5
6
7
8
[root@sanpao1 ~]# sed -n "2,3p" 1.txt
2
3
[root@sanpao1 ~]# sed -n "2p;4p" 1.txt
2
4
[root@sanpao1 ~]# sed -n "1~2p" 1.txt
1
3
5
7
[root@sanpao1 ~]# sed -n "2~2p" 1.txt
2
4
6
8
[root@sanpao1 ~]# sed -n "1~3p" 1.txt //步长3
1
4
7
man sed
addressess
2.正则
/正则/
sed -n “/root/p” 文件 //把有root的那一行打印
sed -n “/root/d” 文件 //-d删除
[root@room3pc14 桌面]# sed -n "/root/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
脚本:自动管理
[root@sanpao1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
sed -n "/IPADDR/p" ///onboot是否开机
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.指令
增【a,i】 sed "3i xxx" 文件 //a是在3后添加,i是在3前添加
[root@sanpao1 test]# sed "3a xxxx" a.txt //有默认输出。先测试,再-i【修改原文件】。
1
2
3
xxxx
4
5
6
7
8
9
0
[root@sanpao1 test]# sed "3i xxxx" a.txt
1
2
xxxx
3
4
5
6
7
8
9
0
[root@sanpao1 test]# cat a.txt
1
2
3
4
5
6
7
8
9
0
删 [d] sed '3d' 文件
sed "/[0-9]/d" 文件
改[c,s] [change,substitute] 【注意:c修改一整行,s仅修改某个关键词】
sed "3c xxx" 文件
sed "/正则/c 内容"
sed "3【3可加可不加,仅替换第三行】s/old/new/" 文件 s 关键词替换
sed -r【扩展正则】"s/[0-9]/new/" 文件
sed “s/x//” 文件 把x替换成空,即删除【变相删除】
[root@sanpao1 test]# sed "3c vv" a.txt //无论第三行是什么,都改为vv
1
2
vv
4
5
6
[root@sanpao1 test]# sed "c xxxx" a.txt //替换全文0
xxxx
xxxx
xxxx
[root@sanpao1 test]# sed "s/2010/xxxx/" a.txt //默认替换每行第一个
xxxx 2011 2010
2001 2006 xxxx
xxxx 2010 2010
[root@sanpao1 test]# sed "s/2010/xxxx/2" a.txt //替换每行第二个
2010 2011 xxxx
2001 2006 2010
2010 xxxx 2010
[root@sanpao1 test]# sed "3s/2010/xxxx/2" a.txt //替换第三行第二个
2010 2011 2010
2001 2006 2010
2010 xxxx 2010
[root@sanpao1 test]# sed "s/2010/xxxx/g" a.txt //替换全部
xxxx 2011 xxxx
2001 2006 xxxx
xxxx xxxx xxxx
[root@sanpao1 test]# sed "s/$/ xxx/" a.txt //$在每行的行尾添加xxx
2010 2011 2010 xxx
2001 2006 2010 xxx
2010 2010 2010 xxx
[root@sanpao1 test]# egrep "[0-9]{1,}" /etc/passwd //\在扩展正则里面不识别
[root@sanpao1 test]# grep "[0-9]{1,}" /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
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
[root@room3pc14 test]# cp /etc/libvirt/qemu/desktop.xml libvirt.txt
复制一个素材文件,修改如下信息
name,uuid,mac,source
NAME,UUID,MAC,source
grep -i "name" 文件 【先观察数据】
sed -n "s/old/new/p" 文件 【方便验证】
[root@room3pc14 test]# sed -i "/<name>/c <name>abc</name>" libvirt.txt
[root@room3pc14 test]# grep -i "<name>" libvirt.txt
<name>abc</name>
[root@room3pc14 test]# sed -i "/<name>/s/>.*</>bcd</" libvirt.txt ###
[root@room3pc14 test]# grep -i "<name>" libvirt.txt
<name>bcd</name>
read -p "请输入虚拟机编号:" num
sed "s/old/new"
sed "s/desktop/clone-v$num"
查p
sed “a,i,c,s,d,p”
sed 选项“定位指令” 文件
1.行号
2./正则/
vim a,i,s,o新建,r替换,x,dd,yy,p
sed&awk【书】【更多的正则表达式】
vim abc.conf
Documentroot /var/www/html
把/var/www/html---》/data/html
sed "11s/ \/var/www/html\ / \/data/html\"
sed "11s/【替换开始】\【为/转义】/var/www/html\/【替换结束】\【转义】/data/html/【结尾】 //【这样太乱了!!最好不这么用】
sed -n s/ / /p 搭配用 显示替换的那一行
sed "s# # #" 文件
sed "s, , , " 文件
sed "s! ! !" 文件
【sed 中的///能够替换成任意符号】
sed “指令” 文件
/etc/httpd/conf/httpd.conf //能够拿这个文件联系
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
163面试题!!!
sed ‘s9\98\9\997\98\99’ 文件
sed ‘s9 \98\9\9 9 7\98\9 9’ 文件
读取用户输入的密码
判断密码对不对,若是输入错三次,则退出
for i in {1..3}
do
read -p "请输入密码" 密码
if [ $pass == "abc" ];then
echo “对”
exit
done
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
理解
正则()保留
abcttabcxxabcqqabcopabc
grep "(abc)tt\1xx\1qq1\1op\1" a.txt
复制
vim ifcfg-eth0
IPADDR=192.168.4.5
GATWAY=192.168.4.254
DNS=1.1.1.1
sed "/IPADDR/s/192.168.4.5/1.1.1.1/"
sed "s/(IPADDR=)./\IPADDR=12.2.2.2/"
sed "s/(IPADDR=)【复制】./ \IPADDR=1 【粘贴()里面的内容】 2.2.2.2/"
联系
hello the world
ni hao ma nb
chi le ma
yue ma
要求:将每一行的第一个字符与最后一个字符对调一下
提示:什么是第一个字符,什么是最后一个字符
保留()
sed -r "s/old/new/" 文件
^.开头
.*中间的内容
.$ 结尾
sed -r "s/ (^.) (.) (.$)/ \3\2\1" #### (^.)是1,(.)是2,(.$)是3
要求:将每一行的第2个字符与倒数第2个字符对调一下
提示:什么是第2个字符,什么是倒数第2个字符
保留()
[root@room3pc14 test]# sed -ri "s/(^.)(.)(.*)(.)(.$)/\1\4\3\2\5/" a.txt
^..第二个字符
..$ 倒数第二个字符
[root@room3pc14 test]# sed -n "2,+2 p" a.txt
从第二行开始,包含第二行,再加2行
sed -n "p,n" a.txt // 读基数行 ,
sed -n "p,n" a.txt //读偶数行
sed -n "$=" a.txt //统计一共有几行
[root@room3pc14 test]# sed -n "$=" a.txt
4
[root@room3pc14 test]# wc -l /etc/passwd
46 /etc/passwd
[root@room3pc14 test]# cat /etc/passwd | wc -l
46
sed "s/^/#/" 文件 //加注释
sed "s/#//" 文件 //去注释122
vim
:r
:w /a.txt 另存到
sed "r /etc/hosts" a.txt 倒入
sed "2w c.txt" a.txt //把a文件存到c文件里
Top
NSD SHELL DAY05
案例1:sed基本用法 案例2:使用sed修改系统配置 案例3:sed多行文本处理 案例4:sed综合脚本应用
1 案例1:sed基本用法
1.1 问题
本案例要求熟悉sed命令的p、d、s等常见操做,并结合正则表达式,完成如下任务:
删除文件中每行的第二个、最后一个字符 将文件中每行的第一个、第二个字符互换 删除文件中全部的数字、行首的空格 为文件中每一个大写字母添加括号
1.2 方案
sed文本处理工具的用法:
用法1:前置命令 | sed [选项] '编辑指令' 用法2:sed [选项] '编辑指令' 文件.. ..
相关说明以下:
“编辑指令”能够为增删改查等指令 “定址符”用来定义须要操做的文本,由“[地址1 [,地址2]]组成 未指定“定址符”时,默认处理全部文本
1.3 步骤
实现此案例须要按照以下步骤进行。
步骤一:认识sed工具的基本选项
1)sed命令的 -n 选项
执行p打印等过滤操做时,但愿看到的是符合条件的文本。但不使用任何选项时,默认会将原始文本一并输出,从而干扰过滤效果。好比,尝试用sed输出/etc/rc.local的第1行:
[root@svr5 ~]# sed '1p' /etc/rc.local #!/bin/sh #!/bin/sh # # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff.
能够发现全部的行都被显示出来了。—— 正确的用法应该添加 -n 选项,这样就能够只显示第1行了:
[root@svr5 ~]# sed -n '1p' /etc/rc.local #!/bin/s
而在执行d删除等过滤操做时,但愿看到的是删除符合条件的文本以后还可以被保留下来的文本,因此这时候就不该该使用 -n 选项了。好比,删除/etc/rc.local文件的第1-4行文本:
[root@svr5 ~]# sed '1,4d' /etc/rc.local # want to do the full Sys V style init stuff. touch /var/lock/subsys/local
2)sed命令的 -i 选项
正常状况下,sed命令所作的处理只是把操做结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件作任何更改:
[root@svr5 ~]# sed '1,4d' rclocal.txt //删除第1~4行,输出结果 # want to do the full Sys V style init stuff. touch /var/lock/subsys/local [root@svr5 ~]# cat rclocal.txt //查看原始文本,并未改动
若但愿直接修改文件内容,应添加选项 -i 。
好比,直接删除rcloal.txt文件的第1~4行,不输出结果:
[root@svr5 ~]# sed -i '1,4d' rclocal.txt //删除操做 [root@svr5 ~]# cat rclocal.txt //确认删除结果
下文中关于使用sed修改文件的示例中,为了不你们在练习过程当中因误操做致使系统故障,部分命令省略 –i 选项,再也不逐一说明。须要时,你们可自行加上此选项。
3)多个指令可使用分号隔离
用分号来隔离多个操做(若是有定址条件,则应该使用{ }括起来),好比:
[root@svr5 ~]# sed -n '1p;4p' /etc/rc.local #!/bin/sh # You can put your own initialization stuff in here if you don't
或者:
[root@svr5 ~]# sed -n '{1p;4p}' /etc/rc.local #!/bin/sh # You can put your own initialization stuff in here if you don't
步骤二:认识sed工具的p输出操做
先建立一个练习用的测试文件,每一行以前添加行号,方便练习时查看效果:
[root@svr5 ~]# cat -n /etc/rc.local > rclocal.txt [root@svr5 ~]# cat rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
1)输出全部行,至关于cat命令。
[root@svr5 ~]# sed -n 'p' rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
2)输出第4行。
[root@svr5 ~]# sed -n '4p' rclocal.txt 4 # You can put your own initialization stuff in here if you don't
3)输出第4~7行。
[root@svr5 ~]# sed -n '4,7p' rclocal.txt 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
4)输出第4行和第7行。
[root@svr5 ~]# sed -n '4p;7p' rclocal.txt 4 # You can put your own initialization stuff in here if you don't 7 touch /var/lock/subsys/local
5)输出第2行及以后的3行。
[root@svr5 ~]# sed -n '2,+3p' rclocal.txt 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff.
6)输出以local结尾的行。
[root@svr5 ~]# sed -n '/local$/p' rclocal.txt 7 touch /var/lock/subsys/local
7)输出奇数行。
[root@svr5 ~]# sed -n 'p;n' rclocal.txt 1 #!/bin/sh 3 # This script will be executed *after* all the other init scripts. 5 # want to do the full Sys V style init stuff. 7 touch /var/lock/subsys/local
8)输出偶数行。
[root@svr5 ~]# sed -n 'n;p' rclocal.txt 2 # 4 # You can put your own initialization stuff in here if you don't 6
9)从第5行输出到最后一行。
[root@svr5 ~]# sed -n '5,$p' rclocal.txt 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
10)输出文本的行数。
[root@svr5 ~]# sed -n '$=' rclocal.txt 7
步骤三:认识sed工具的d输出操做
还以rclocal.txt文件为例,文件内容以下所示:
[root@svr5 ~]# cat rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
1)删除第3~5行文本
[root@svr5 ~]# sed '3,5d' rclocal.txt 1 #!/bin/sh 2 # 6 7 touch /var/lock/subsys/local
2)删除全部包含“init”的行
[root@svr5 ~]# sed '/init/d' rclocal.txt 1 #!/bin/sh 2 # 6 7 touch /var/lock/subsys/local
3)删除全部包含“init”的行、全部包含“bin”的行
[root@svr5 ~]# sed '/init/d;/bin/d' rclocal.txt 2 # 6 7 touch /var/lock/subsys/local
4)删除不包括“init”的行
[root@svr5 ~]# sed '/init/!d' rclocal.txt 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff.
这个实际效果至关于只显示包含“init”的行:
[root@svr5 ~]# sed -n '/init/p' rclocal.txt 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff.
5)删除文件的最后一行
[root@svr5 ~]# sed '$d' rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6
6)删除文件中的空行
手动新建一个测试文件:
[root@svr5 ~]# vim blankline.txt abc def hijklmn hello world I am here end
删除全部空行:
[root@svr5 ~]# sed '/^$/d' blankline.txt abc def hijklmn hello world I am here end
步骤四:认识sed工具的s替换操做
还以rclocal.txt文件为例,文件内容以下所示:
[root@svr5 ~]# cat rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
1)将全部行中的第一个“ll”(若是有的话)替换为“TARENA”。
[root@svr5 ~]# sed 's/ll/TARENA/' rclocal.txt 1 #!/bin/sh 2 # 3 # This script wiTARENA be executed *after* all the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the fuTARENA Sys V style init stuff. 6 7 touch /var/lock/subsys/local
2)将全部的“ll”(若是有的话)替换为“TARENA”。
[root@svr5 ~]# sed 's/ll/TARENA/g' rclocal.txt 1 #!/bin/sh 2 # 3 # This script wiTARENA be executed *after* aTARENA the other init scripts. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the fuTARENA Sys V style init stuff. 6 7 touch /var/lock/subsys/local
3)将第3行内的第2个“script”替换为“SCRIPT”。
[root@svr5 ~]# sed '3s/script/SCRIPT/2' rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other init SCRIPTs. 4 # You can put your own initialization stuff in here if you don't 5 # want to do the full Sys V style init stuff. 6 7 touch /var/lock/subsys/local
4)删除文件内指定的字符串(替换为空)。
删除全部的“init”字符串:
[root@svr5 ~]# sed 's/init//g' rclocal.txt 1 #!/bin/sh 2 # 3 # This script will be executed *after* all the other scripts. 4 # You can put your own ialization stuff in here if you don't 5 # want to do the full Sys V style stuff. 6 7 touch /var/lock/subsys/local
删除全部的“script”、全部的“stuff”、全部的字母e,或者的关系用转义方式 | 来表示:
[root@svr5 ~]# sed 's/script\|stuff\|e//g' rclocal.txt 1 #!/bin/sh 2 # 3 # This will b xcutd *aftr* all th othr init s. 4 # You can put your own initialization in hr if you don't 5 # want to do th full Sys V styl init . 6 7 touch /var/lock/subsys/local
5)配置行的注释、解除注释。
以真实文件/etc/rc.local为例,文件内容以下:
[root@svr5 ~]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local
解除/etc/rc.local文件第3~5行的注释(去掉开头的 # ):
[root@svr5 ~]# sed '3,5s/^#//' /etc/rc.local #!/bin/sh # This script will be executed *after* all the other init scripts. You can put your own initialization stuff in here if you don't want to do the full Sys V style init stuff. touch /var/lock/subsys/local
将/etc/rc.local文件的第6~7行注释掉(行首添加 # ):
[root@svr5 ~]# sed '6,7s/^/#/' /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. # #touch /var/lock/subsys/local
步骤五:利用sed完成本例要求的任务
参考数据文件内容以下:
[root@svr5 ~]# cat nssw.txt An example Name Service Switch config file. This file should be sorted with the most-used services at the beginning. # The entry '[NOTFOUND=return]' means that the search for an entry should stop if the search in the previous entry turned up nothing. Note that if the search failed due to some other reason (like no NIS server responding) then the search continues with the
本小节的操做使用nssw.txt做为测试文件。
1)删除文件中每行的第二个、最后一个字符
分两次替换操做,第一次替换掉第2个字符,第二次替换掉最后一个字符:
[root@svr5 ~]# sed 's/.//2;s/.$//' nssw.txt A example Name Service Switch config file. This file should b srted with the most-used services at the beginning # Te entry '[NOTFOUND=return]' means that the search for a etry should stop if the search in the previous entry turne u nothing. Note that if the search failed due to some other reaso (ike no NIS server responding) then the search continues with th
2)将文件中每行的第一个、第二个字符互换
每行文本拆分为“第1个字符”、“第2个字符”、“剩下的全部字符”三个部分,而后经过替换操做重排顺序为“2-1-3”:
[root@svr5 ~]# sed -r 's/^(.)(.)(.*)/\2\1\3/' nssw.txt nA example Name Service Switch config file. This file should be osrted with the most-used services at the beginning. # hTe entry '[NOTFOUND=return]' means that the search for an netry should stop if the search in the previous entry turned pu nothing. Note that if the search failed due to some other reason l(ike n up . Note that if the search failed due to some other (like NIS server responding) then the search continues with
3)删除文件中全部的数字、行首的空格
因原文件内没有数字,行首也没有空格,这里稍做作一点处理,生成一个新测试文件:
[root@svr5 ~]# sed 's/o/o7/;s/l/l4/;3,5s/^/ /' nssw.txt > nssw2.txt [root@svr5 ~]# cat nssw2.txt An exampl4e Name Service Switch co7nfig file. This file should be so7rted with the most-used services at the beginning. # The entry '[NOTFOUND=return]' means that the search fo7r an entry sho7ul4d stop if the search in the previous entry turned up no7thing. Note that if the search fail4ed due to some other reason (l4ike no7 NIS server responding) then the search continues with the
以nssw2.txt文件为例,删除全部数字、行首空格的操做以下:
[root@svr5 ~]# sed -r 's/[0-9]//g;s/^( )+//' nssw2.txt
4)为文件中每一个大写字母添加括号
使用“&”可调用s替换操做中的整个查找串,因此可参考下列操做解决:
[root@svr5 ~]# sed 's/[A-Z]/(&)/g' nssw.txt (A)n example (N)ame (S)ervice (S)witch config file. (T)his file should be sorted with the most-used services at the beginning. # (T)he entry '[(N)(O)(T)(F)(O)(U)(N)(D)=return]' means that the search for an entry should stop if the search in the previous entry turned up nothing. (N)ote that if the search failed due to some other reason (like no (N)(I)(S) server responding) then the search continues with the
2 案例2:使用sed修改系统配置
2.1 问题
本案例要求熟悉课上的sed应用案例,并编写脚本anonftp.sh,实现如下功能:
经过yum安装vsftpd软件包 修改vsftpd服务配置,开启匿名上传 调整/var/ftp/pub目录权限,容许ftp写入 启动vsftpd服务,并设置开机自运行
2.2 步骤
实现此案例须要按照以下步骤进行。
步骤一:认识课堂上的sed练习
1)修改默认运行级别
将默认运行级别修改成5,确认修改结果:
[root@svr5 ~]# sed -i '/^id:/s/3/5/' /etc/inittab [root@svr5 ~]# grep "^id:" /etc/inittab id:5:initdefault:
再改回去:
[root@svr5 ~]# sed -i '/^id:/s/5/3/' /etc/inittab [root@svr5 ~]# grep "^id:" /etc/inittab id:3:initdefault:
2)修改IP地址的网段部分,主机地址不变。
直接修改网卡eth0的配置文件,检查原有的配置内容:
[root@svr5 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none HWADDR=00:0c:29:82:09:e9 ONBOOT=yes NETMASK=255.255.255.0 IPADDR=192.168.4.4 TYPE=Ethernet
若但愿将IP地址192.168.4.4修改成172.16.16.4,则应该定位到“IPADDR”所在的行,执行相应的替换(仅测试,还没有修改):
[root@svr5 ~]# sed '/^IPADDR/s/192.168.4.4/172.16.16.4/' \ /etc/sysconfig/network-scripts/ifcfg-eth0 | grep "^IPADDR" IPADDR=172.16.16.4
要求只修改网段地址时,能够利用扩展正则表达式的 \一、\二、……等调用,分别对应此前第1个、第2个、…… 以 ()包围的表达式所匹配的内容。
因此上述操做能够改成以下(启用扩展匹配应添加 -r 选项):
[root@svr5 ~]# sed -r -i '/^IPADDR/s/192.168.4.(.*)/172.16.16.\1/' \ /etc/sysconfig/network-scripts/ifcfg-eth0
确认修改结果:
[root@svr5 ~]# grep "^IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=172.16.16.4
再改回去:
[root@svr5 ~]# sed -r -i '/^IPADDR/s/172.16.16.(.*)/192.168.4.\1/' \ /etc/sysconfig/network-scripts/ifcfg-eth0 [root@svr5 ~]# grep "^IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=192.168.4.4
3)调整httpd服务配置,更改网站根目录
因为须要替换的字符串中有 / ,为了不与sed替换操做的分隔混淆,可使用其余字符做为替换分隔,好比可改用“s#old#new#”的方式实现替换:
[root@svr5 ~]# sed -i 's#/var/www/html#/opt/wwwroot#' \ /etc/httpd/conf/httpd.conf [root@svr5 ~]# grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/opt/wwwroot"
若要恢复,可再改回去:
[root@svr5 ~]# sed -i 's#/opt/wwwroot#/var/www/html#'\ /etc/httpd/conf/httpd.conf [root@svr5 ~]# grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/html"
步骤二:编写anonftp.sh脚本,用来装配匿名FTP服务
1)任务需求及思路分析
vsftpd服务的安装、改目录权限、起服务等操做能够直接写在脚本中。
修改vsftpd.conf配置的工做可使用sed命令,根据默认配置,只须要定位到以#anon开头的行,去掉开头的注释便可。
2)根据实现思路编写脚本文件
[root@svr5 ~]# vim anonftp.sh #!/bin/bash yum -y install vsftpd //安装vsftpd软件 cp /etc/vsftpd/vsftpd.conf{,.bak} //备份默认的配置文件 sed -i "/^#anon/s/^#//" /etc/vsftpd/vsftpd.conf //修改服务配置 chown ftp /var/ftp/pub //调整目录权限 /etc/init.d/vsftpd restart //启动服务 chkconfig vsftpd on //设为自动运行 [root@svr5 ~]# chmod +x anonftp.sh
3)验证、测试脚本
运行脚本anonftp.sh:
[root@svr5 ~]# ./anonftp.sh .. .. Installed: vsftpd.x86_64 0:2.0.5-28.el5 Complete! 关闭 vsftpd: [失败] 为 vsftpd 启动 vsftpd: [肯定]
使用ftp登陆服务,测试是否能够上传:
[root@svr5 ~]# ftp localhost //本机访问测试 Connected to localhost.localdomain. 220 (vsFTPd 2.0.5) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (localhost:root): ftp //匿名登陆 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub //切换到 pub/ 目录 250 Directory successfully changed. ftp> put install.log //上传当前目录下的install.log 文件 local: install.log remote: install.log 227 Entering Passive Mode (127,0,0,1,192,127) 150 Ok to send data. 226 File receive OK. 33139 bytes sent in 0.0065 seconds (5e+03 Kbytes/s) ftp> quit //断开FTP链接 221 Goodbye.
查看/var/ftp/pub新上传的文件:
[root@svr5 ~]# ls -lh /var/ftp/pub/ 总计 36K -rw------- 1 ftp ftp 33K 12-13 18:25 install.log
3 案例3:sed多行文本处理
3.1 问题
本案例要求使用sed工具来完成下列任务操做:
修改主机名配置文件 修改hosts文件,添加两条映射记录:192.168.4.5 与 svr5.tarena.com、svr5,还有119.75.217.56与www.baidu.com
3.2 方案
sed工具的多行文本处理操做:
i:在指定的行以前插入文本 a:在指定的行以后追加文本 c:替换指定的行
3.3 步骤
实现此案例须要按照以下步骤进行。
步骤一:修改主机名配置文件
1)确认修改前的配置
[root@svr5 ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=svr5.tarena.com
2)使用sed修改主机名配置所在行的内容(c整行替换)
[root@svr5 ~]# sed '/^HOSTNAME/cHOSTNAME=mysvr.tarena.com' /etc/sysconfig/network
步骤二:修改hosts文件,添加新的记录
1)确认修改前的配置
[root@svr5 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
2)使用sed修改hosts文件,添加两行新纪录(a追加)
[root@svr5 ~]# sed -i '$a192.168.4.5 svr5.tarena.com svr5\ > 119.75.217.56 www.baidu.com' /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.4.5 svr5.tarena.com svr5 119.75.217.56 www.baidu.com
4 案例4:sed综合脚本应用
4.1 问题
本案例要求编写脚本getupwd.sh,实现如下需求:
找到使用bash做登陆Shell的本地用户 列出这些用户的shadow密码记录 按每行“用户名 --> 密码记录”保存到getupwd.log,如图-1所示
图-1
4.2 方案
基本思路以下:
先用sed工具取出登陆Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量 再结合while循环遍历取得的帐号记录,逐行进行处理 针对每一行用户记录,采用掐头去尾的方式得到用户名、密码字串 按照指定格式追加到/tmp/getuupwd.log文件 结束循环后删除临时文件,报告分析结果
4.3 步骤
实现此案例须要按照以下步骤进行。
步骤一:编写getupwd.sh脚本
[root@svr5 ~]# vim ./getupwd.sh #/bin/bash > /tmp/getupwd.log ## 建立空文件 sed -n '/:\/bin\/bash$/w /tmp/urec.tmp' /etc/passwd ## 提取符合条件的帐号记录 UNUM=$(egrep -c '.' /tmp/urec.tmp) ## 取得记录个数 while [ ${i:=1} -le $UNUM ] ## 从第1行开始,遍历帐号记录 do UREC=$(sed -n "${i}p" /tmp/urec.tmp) ## 取指定行数的记录 NAME=${UREC%%:*} ## 截取用户名(记录去尾) PREC=$(sed -n "/^$NAME:/p" /etc/shadow) ## 查找与用户名对应的密码记录 PASS=${PREC#*:} ## 掐头 PASS=${PASS%%:*} ## 去尾,只留下密码记录 echo "$NAME --> $PASS" >> /tmp/getupwd.log ## 保存结果 let i++ ## 自增1,转下一次循环 done /bin/rm -rf /tmp/urec.tmp ## 删除临时文件 echo "用户分析完毕,请查阅文件 /tmp/getupwd.log" ## 完成后提示 [root@svr5 ~]# chmod +x ./getupwd.sh
步骤二:测试、验证执行结果
[root@svr5 ~]# ./getupwd.sh 用户分析完毕,请查阅文件 /tmp/getupwd.log [root@svr5 ~]# less /tmp/getupwd.log root --> $6$IWgMYmRACwdbfwBo$dr8Yn983nswiJVw0dTMjzbDvSLeCd1GMYjbvsDiFEkL8jnXOLcocBQypOCr4C6BRxNowIxjh6U2qeFU0u1LST/ zengye --> $6$Qb37LOdzRl5995PI$L0zTOgnhGz8ihWkW81J.5XhPp/l7x2./Me2ag0S8tRndCBL9nIjHIKkUKulHxJ6TXyHYmffbVgUT6pbSwf8O71 clamav --> !! mysql --> !! abc --> !! .. ..
从上述参考脚本能够发现,使用sed来实现字段提取会比较复杂。下一章课程将会学到awk命令,届时能够经过更简单的方法来改进此脚本内容。