我是bash脚本的初学者。我想创build一个bash脚本来自动安装我的linux系统上的安装和configuration文件。
假设我想编辑
/etc/yum.repos.d/epel.repo
由bash脚本
我想要做的是如下
对于我添加的第一部分
yum install nano nano /etc/yum.repos.d/epel.repo
我的问题是如何使用nano做bash脚本的第二和第三部分(如果可能的话,如果不可能,然后用sed显示我)
还有一些地方,我将不得不修改文件中的variables例如
我知道它的要求很高,但是我需要为服务器pipe理的小老头们创build这个。不幸的是,我没有时间从开始时就开始学习bash脚本,因为我的考试近了。我会用你的例子来写脚本。
伙计们感谢所有答复,我已经成功完成了大部分的bash脚本
但是我有另一个问题让我们假设我想修改nginx.conf使用sed我们将处理worker_processes
现在我想使用sed来完成以下工作1. worker_processes conf中worker_processes的第一次出现 ,并用worker_processes 4;replace文本worker_processes 4;
特别提示:这只是一个例子。 可能会发生conf包含worker_processes 1; 。 这是很难的部分。 我想要一个sed命令,它查找单词worker_processes的第一个wHOLE匹配大小写 ,删除find该单词的文本行,并粘贴worker_processes 4; 然后保存文件。 这是我编辑文件时最可靠的方法(没有任何破坏任何conf的风险
最后一个build议我使用sed -i's / enabled = 0 / enabled = 1 / g'/etc/yum.repos.d/remi.repo在remi的remi部分下将enabled = 0改为enabled = 1 .repo。然而,我有一种感觉,它可能会修改所有启用= 0在该文件,这将发送服务器。可以任何人提出一个更好的代码。
另一个我不确定的东西:PI想要编辑一个文件,这个文本testing=“0”(是它有引号,我需要保持它)应该从testing=“0”修改为testing=“ 1“(带引号)
另外我需要添加一些文本与文件结尾的文件与sed像“谢谢广达”(与报价)对于PHP你把一个\回声引号,不知道它是如何做bash
另一件事
我需要在conf中修改一行,但我不记得要replace的整个文本是什么
喜欢听=某事; ,我想修改它来监听= /tmp/php5-fpm.sock;
大拇指向上量子
感谢真棒支持家伙
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo
如果需要,指定就地编辑选项( -i )(首先使用.bak扩展名进行备份):
sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo
现在我想使用sed来完成以下工作1.findconf中worker_processes的第一次出现,并用worker_processes 4replace文本;
sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf
最后一个build议我使用
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repo[remi]在remi.repo[remi]部分下将enabled=0改为enabled=1remi.repo。 然而,我有一种感觉,它可能会修改所有enabled=0在该文件,这将发送服务器。可以任何人build议一个更好的代码
在这里给你:
sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo
另一个我不确定的东西:PI想要编辑一个文件,这个文本testing=“0”(是它有引号,我需要保持它)应该从testing=“0”修改为testing=“ 1“(带引号)
sed 's/Testing = "0"/Testing = "1"/g'
另外我需要添加一些文本与文件结尾的文件与sed像“谢谢广达”(与报价)对于PHP你把一个\回声引号,不知道它是如何做bash
sed '$a"Werulz, you are welcome"\'
另一件事,我需要修改一个conf中的一行,但我不记得什么是整个文本来取代
喜欢听=某事; ,我想修改它来监听= /tmp/php5-fpm.sock;
sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
就像ptman说的那样, Augeas可以避免使用sed / awk :
$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10
会将epel仓库的优先级设置为10.如果priority键已经存在,它将设置它的值,否则它会在该priority的最后一个条目之后添加一个priority条目。
其他值也可能需要修改。
如果你想修改几个值,你甚至可以使用augtool作为解释器:
$ cat epel.augtool #!/usr/bin/augtool -sf # Make a variable defvar epel /files/etc/yum.repos.d/epel.repo/epel # Set values set $epel/enable 1 set $epel/priority 10 set $epel/Testing 0 $ chmod +x epel.augtool $ ./epel.augtool Saved 1 file(s)
如果你想把它保存在你的bash脚本中,你可以把这些命令input到augtool :
cat <<EOF | augtool # Make a variable defvar epel /files/etc/yum.repos.d/epel.repo/epel # Set values set $epel/enable 1 set $epel/priority 10 set $epel/Testing 0 save EOF
看到man augtool更多的select。
使用Augeas vs sed / awk有几个好处:
yum.repo语法)。 如果你的正则expression式是错误的,你将不会冒险破坏文件的语法; 你也可能想看看Augeas ,编程修改configuration文件的工具。 它与Puppet (一个configurationpipe理系统)结合是非常强大的,但是也可以单独使用。