shell sed多行文本处理

3.sed多行文本处理
问题
本案例要求使用sed工具来完成下列任务操作:
修改主机名配置文件
修改hosts文件,添加两条映射记录:192.168.4.5 与 svr5.tarena.com、svr5,还有119.75.217.56与www.baidu.com
方案
sed工具的多行文本处理操作:
i:在指定的行之前插入文本
a:在指定的行之后追加文本
c:替换指定的行
步骤
实现此案例需要按照如下步骤进行。
步骤一:修改主机名配置文件
1)确认修改前的配置
[root@svr5 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=svr5.tarena.com
2)使用sed修改主机名配置所在行的内容(c整行替换)
[root@svr5 ~]# sed -i
‘/^HOSTNAME/cHOSTNAME=mysvr.tarena.com’ /etc/sysconfig/network
3)确认修改结果
[root@svr5 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=mysvr.tarena.com
4)恢复原有配置
[root@svr5 ~]# sed -i
‘/^HOSTNAME/cHOSTNAME=svr5.tarena.com’ /etc/sysconfig/network

[root@svr5 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=svr5.tarena.com
步骤二:修改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
3)确认修改结果
[root@svr5 ~]# cat /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.sed综合脚本应用
问题
本案例要求编写脚本getupwd.sh,实现以下需求:
找到使用bash作登录Shell的本地用户
列出这些用户的shadow密码记录
按每行“用户名 --> 密码记录”保存到getupwd.log,如图-1所示
在这里插入图片描述
图-1
方案
基本思路如下:
1)先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量
2)再结合while循环遍历取得的账号记录,逐行进行处理
3)针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串
4)按照指定格式追加到/tmp/getuupwd.log文件
5)结束循环后删除临时文件,报告分析结果
步骤
实现此案例需要按照如下步骤进行。
步骤一:编写getupwd.sh脚本
[root@svr5 ~]# vim ./getupwd.sh
#/bin/bash
/tmp/getupwd.log ## 创建空文件
sed -n '/:/bin/bashKaTeX parse error: Expected 'EOF', got '#' at position 33: … /etc/passwd #̲# 提取符合条件的账号记录 U…(egrep -c ‘.’ /tmp/urec.tmp) ## 取得记录个数
while [ ${i:=1} -le KaTeX parse error: Expected 'EOF', got '#' at position 17: …NUM ] #̲# 从第1行开始,遍历账号记录…(sed -n "KaTeX parse error: Expected 'EOF', got '#' at position 26: …/urec.tmp) #̲# 取指定行数的记录 …{UREC%%:} ## 截取用户名(记录去尾)
PREC=KaTeX parse error: Expected group after '^' at position 11: (sed -n "/^̲NAME:/p" /etc/shadow) ## 查找与用户名对应的密码记录
PASS=KaTeX parse error: Expected '}', got '#' at position 6: {PREC#̲*:} …{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 6 IWgMYmRACwdbfwBo$dr8Yn983nswiJVw0dTMjzbDvSLeCd1GMYjbvsDiFEkL8jnXOLcocBQypOCr4C6BRxNowIxjh6U2qeFU0u1LST/
zengye --> 6 6 Qb37LOdzRl5995PI$L0zTOgnhGz8ihWkW81J.5XhPp/l7x2./Me2ag0S8tRndCBL9nIjHIKkUKulHxJ6TXyHYmffbVgUT6pbSwf8O71
clamav --> !!
mysql --> !!
abc --> !!
… …
从上述参考脚本可以发现,使用sed来实现字段提取会比较复杂。下一章课程将会学到awk命令,届时可以通过更简单的方法来改进此脚本内容。

发布了121 篇原创文章 · 获赞 69 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/iT__SuperMan/article/details/90746378