通过bash脚本编辑文件

我是bash脚本的初学者。我想创build一个bash脚本来自动安装我的linux系统上的安装和configuration文件。

假设我想编辑

/etc/yum.repos.d/epel.repo 

由bash脚本

我想要做的是如下

  1. 打开文件/etc/yum.repos.d/epel.repo
  2. find[epel]部分
  3. 在epel部分中,在行enabled = 1之后添加一行priority = 10

对于我添加的第一部分

 yum install nano nano /etc/yum.repos.d/epel.repo 

我的问题是如何使用nano做bash脚本的第二和第三部分(如果可能的话,如果不可能,然后用sed显示我)

还有一些地方,我将不得不修改文件中的variables例如

  1. 启用= 0启用= 1
  2. testing=“1”到testing=“0”
  3. 在一行中添加文本。 functions = to function =“text1”,“text2”
  4. 添加一些文本到一个文件并保存(与纳米)

我知道它的要求很高,但是我需要为服务器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=1 remi.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有几个好处:

  • Augeas拥有了解文件语法的parsing器(在这里是yum.repo语法)。 如果你的正则expression式是错误的,你将不会冒险破坏文件的语法;
  • Augeas yum.repoparsing器知道yum.repo部分,所以你知道你正在编辑正确的部分;
  • Augeas是幂等的。 它只会对文件进行更改,如果有更改。 如果所有的值都已经设置好,它不会修改文件。
  • Augeas有一个Puppet提供者,所以你可以在Puppet基础设施中轻松地自动化这个。
  • 如果参数还不存在,Augeas会为你创build它们。 如果该部分还不存在,Augeas也将使用正确的语法创build它。

你也可能想看看Augeas ,编程修改configuration文件的工具。 它与Puppet (一个configurationpipe理系统)结合是非常强大的,但是也可以单独使用。