一、前言
当我们在进行自动化shell脚本编辑的时候,有时候需要进行编辑或者修改相应的配置文件。
那么sed是一个很不错的选择
二、sed介绍
sed是Linux下一款功能强大的非交互流式文本编辑器。
对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,适合大文件之类的编辑。
1、sed命令格式:
sed [参数] "command" 文件所在路径
2、常见参数:
-n∶ 不加n时,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶ 直接在指令列模式上进行 sed 的动作编辑;
-f∶ 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶ sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶ 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
3、常用命令:
a: 新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c: 取代,c的后面可以接字串,这些字串可以取代 n1,n2之间的行!
d: 删除,因为是删除啊,所以d后面通常不接任何咚咚;
i: 插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p: 打印,打印出匹配的内容,通常与-n选项和用
s: 取代,可以直接进行取代的工作哩!通常这个s的动作可以搭配正规表示法!
4、举例
# 删除某行
sed '1d' test.txt #删除第一行
sed '$d' test.txt #删除最后一行
sed '1,2d' test.txt #删除第一行到第二行
sed '2,$d' test.txt #删除第二行到最后一行
#显示某行
sed -n '1p' test #显示第一行
sed -n '$p' test #显示最后一行
#替换一行中的某部分
#格式:sed 's/要替换的字符串/新的字符串/g'(要替换的字符串可以用正则表达式)
sed 's/ru/bird/g' #替换ru为bird
sed 's/ru//g' test #替换ru为空
#插入
sed -i '$a bye' test #在文件test1中最后一行直接输入"bye"
sed -i '1i\a' test #在文件test1中第一行前插入一行"aaa"
#如果要添加一行,原来该行为空行
sed -i '36s/^/ client_max_body_size 50m;/g' nginx.conf
5、shell中常见用例
注:在shell中,可以采用先定义变量位置。
举例如下:
1、匹配对应的PIDFILE 和 BASEDIR 位置 并进行修改替换。
当我们在编写一键安装自动化脚本时经常用到
#!/bin/bash
AGENT_CONF=/usr/local/zabbix/misc/init.d/fedora/core/zabbix_agentd
sed -i -e 's/^PIDFILE=.*/PIDFILE=/usr/local/zabbix/$BINARY_NAME.pid' ${AGENT_CONF}
sed -i -e 's/^BASEDIR=.*/BASEDIR=/usr/local/zabbix/' ${AGENT_CONF}
sleep 5
2、sed命令替换目录
假设将test.conf中的server和host进行匹配,并且进行替换为目录
使用格式:
sed -i -e "s:匹配参数=.*:匹配参数=替换后的内容:g" 对应的文件路径
1、假设test.sh脚本
#!/bin/bash
TEST_CONF=/home/steve/test.conf
sed -i -e "s:server=.*:server=/opt/zabbix:g" ${TEST_CONF}
sed -i -e "s:host=.*:host=/etc/passwd:g" ${TEST_CONF}
echo "test success!"
2、test.conf文件
# vim test.conf
server:111.111.111.111
host:222.222.222.222
3、然后执行sh test.sh
sh test.sh
# test success~
4、然后查看test.conf
发现已经成功
OK~~