通过bash脚本编辑文件


12

我是bash脚本的初学者。我想创建一个bash脚本以自动方式在Linux机器上安装安装和配置内容。

假设我要编辑

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

通过bash脚本

我想做的如下

  1. 打开文件/etc/yum.repos.d/epel.repo
  2. 查找[epel]部分
  3. 在epel部分中,在启用行= 1之后添加优先级= 10

对于第一部分,我添加了

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

我的问题是如何使用nano使用bash脚本执行第2部分和第3部分(如果可能的话,如果不可能的话,请使用sed向我展示)

同样在某些时候,我将不得不修改文件中的变量,例如

  1. 使能= 0使能= 1
  2. 测试=“ 1”到测试=“ 0”
  3. 在一行中添加文本。功能=功能=“ text1”,“ text2”
  4. 在文件中添加一些文本并保存(使用nano)

我知道这很苛刻,但是我需要为一个对服务器管理没有经验的朋友创建一个脚本。不幸的是,我没有时间从考试开始就学习bash脚本,我将使用您的示例来编写脚本。


伙计们感谢我成功完成了大多数bash脚本的所有回复

但是我还有另一个问题,让我们假设我想使用sed修改nginx.conf我们将处理worker_processes
现在我想使用sed执行以下步骤1.查找该 conf中的第一个匹配worker_processes,并用替换文本worker_processes 4;

这里的特别说明:这只是一个示例。conf可能包含worker_processes 1;。这是很难的部分。我想要一个sed命令,该命令找到单词worker_processes的一个匹配,删除找到该单词的文本行,worker_processes 4;然后粘贴到 该行,然后保存文件。这是我编辑文件时最可靠的方法(不会损坏任何配置文件

我的最后一个建议是使用sed -i's / enabled = 0 / enabled = 1 / g'/etc/yum.repos.d/remi.repo将remi的[remi]部分下的enabled = 0更改为enabled = 1。 .repo。但是我感觉它可能会修改该文件中的所有enabled = 0,这将破坏服务器。任何人都可以提出更好的代码。


我不确定的另一件事:PI想编辑一个带有Text Testing =“ 0”的文件(是的,它带有引号,我需要保留它)应将其从Testing =“ 0”修改为Testing =“ 1“(带引号)

我还需要在sed文件的末尾添加一些带引号的文本,例如“ Thanks Quanta”(带引号)。

另一件事
我需要修改的CONF线,但我不记得什么是全文字,取代

就像它的监听一样。,我想将其修改为监听= /tmp/php5-fpm.sock;

大力支持量子

谢谢你们的支持

Answers:


18
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.找到该conf中worker_processes的第一个匹配项,并用worker_processes 4替换文本;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

最后一个建议我用 sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repo改变enabled=0enabled=1[remi]的部分remi.repo。但是我有一种感觉,它可能会修改enabled=0该文件中的所有内容,这将破坏服务器。有人可以建议一个更好的代码

在这里为您:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

我不确定的另一件事:PI希望编辑一个具有Text Testing =“ 0”的文件(是的,它带有引号,我需要保留它)应将其从Testing =“ 0”修改为Testing =“ 1“(带引号)

sed 's/Testing = "0"/Testing = "1"/g'

我还需要在sed文件的末尾添加一些带引号的文本,例如“ Thanks Quanta”(带引号)。

sed '$a"Werulz, you are welcome"\'

我需要在conf中修改一行,但我不记得要替换的整个文本是什么

就像它的监听一样。,我想将其修改为监听= /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'

'sed'/ enabled = 1 / a \ priority = 10'/
etc/yum.repos.d/epel.repo

@Werulz:只需检查无关紧要的文件,或将epel.repo的内容复制到主目录中的文件,然后尝试在没有root / superuser特权的情况下在其中运行它。
埃里克一世

-i是不是一个标准的选择seded但是,提供了一种符合标准的方式来编辑文件,其语法与sed非常相似。
kojiro 2012年

我更新了我的第一篇文章,问您另一个建议。非常感谢到目前为止的量子支持。
韦勒兹2012年

我再次更新了帖子……很抱歉问了这么多问题。如果您需要的话,将与您共享脚本
Werulz 2012年

12

就像ptman所说的那样,Augeas可以避免使用sed/ awk

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

会将epel存储库的优先级设置为10。如果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脚本中,可以将命令传递到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以获取更多选项。

使用Augeas vs sed/ 有几个优点awk

  • Augeas的解析器了解文件语法(在这种情况下为yum.repo语法)。如果您的正则表达式错误,则不会冒破坏文件语法的风险;
  • Augeas yum.repo解析器了解yum.repo部分,因此您知道您正在编辑正确的部分;
  • Augeas是幂等的。如果要进行更改,它将仅对文件进行更改。如果所有值都已设置,则不会修改文件;
  • Augeas有一个Puppet提供程序,因此您可以在Puppet基础结构中轻松实现此自动化。
  • 如果参数尚不存在,Augeas将为您创建它们。如果该节尚不存在,Augeas还将使用正确的语法创建它。

感谢您的答复……将确定考虑...。您能举一个如何在我的bash脚本中使用它的示例
Werulz

好的,看我的编辑。
ℝaphink

2

您可能还需要检出Augeas,该工具可通过编程方式修改配置文件。与Puppet(配置管理系统)结合使用时,它非常强大,但也可以单独使用。


那是什么笑
Werulz

2
您可以通过简要说明什么是Augeas,也可以添加一个或两个示例来提高此答案的质量。
ThatGraemeGuy 2012年

我添加了一个新问题
Werulz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.