sed 和awk 都是一个过滤工具
sed是过滤行
awk是过滤列
# sed [选项] '条件指令' 文件..
sed工具的多行文本处理操作:
- i: 在指定的行之前插入文本
- a:在指定的行之后追加文本
- c:替换指定的行
基本语法格式案例:
注意:系统默认没有a.txt文件,需要自己创建一个测试文件!!!
- [root@svr5 ~]# sed '2a XX' a.txt //在第二行后面,追加XX
- [root@svr5 ~]# sed '2i XX' a.txt //在第二行前面,插入XX
- [root@svr5 ~]# sed '2c XX' a.txt //将第二行替换为XX
步骤一:修改主机名配置文件
1)确认修改前的配置
- [root@svr5 ~]# cat /etc/hostname
- svr5.tarena.com
2)使用sed修改主机名配置所在行的内容(c整行替换)
- [root@svr5 ~]# sed '1c mysvr.tarena.com' /etc/hostname
步骤二:修改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 '$a 192.168.4.5 svr5.tarena.com svr5' /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
sed综合脚本应用
基本思路如下:
- 先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量
- 再结合while循环遍历取得的账号记录,逐行进行处理
- 针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串
- 按照指定格式追加到/tmp/getuupwd.log文件
- 结束循环后删除临时文件,报告分析结果
实现此案例需要按照如下步骤进行。
步骤一:编写getupwd.sh脚本
- [root@svr5 ~]# vim ./getupwd.sh
- #/bin/bash
- A=$(sed -n '/bash$/s/.*://p' /etc/passwd) ## 提取符合条件的账号记录
- for i in $A ##遍历账号记录
- do
- pass1=$(grep $i /etc/shadow)
- pass2=${pass1#*:}
- pass=${pass2%%:*}
- echo "$i --> $pass"
- done
- [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命令,届时可以通过更简单的方法来改进此脚本内容。
总结知识点:
#sed [选项] '条件指令' 文件
选项:
-n 屏蔽默认输出
-r 支持扩展正则
-i 修改源文件
条件:
行号 4 4,5 4~2 4,+10
/正则/
指令:
p 打印
d 删除
s 替换s/旧/新/g
a 追加
i 插入
c 替换行