通过 bash 脚本编辑文件

通过 bash 脚本编辑文件

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

假设我想编辑

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

通过 bash 脚本

我想要做的如下

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

对于第一部分我添加了

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

我的问题是如何使用 nano 通过 bash 脚本完成第二部分和第三部分(如果可能的话,如果不可能的话,用 sed 给我看看)

另外在某些时候我必须修改文件中的变量例如

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

我知道这很苛刻,但我需要为一个不熟悉服务器管理的朋友创建这个。不幸的是,由于考试临近,我没有时间从头学习 bash 脚本。我将使用你的例子来编写脚本。


感谢大家的回复,我已经成功完成了大部分 bash 脚本

但是我还有另一个问题假设我想使用 sed 修改 nginx.conf 我们将处理 worker_processes
现在我想使用 sed 执行以下操作 1. 找到首次发生worker_processes 该conf中并将文本替换为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.repo 中 [remi] 部分下的 enabled =0 更改为 enabled=1。但是我感觉它可能会修改该文件中的所有 enabled=0,这会破坏服务器。有人可以建议更好的代码吗?


另一件事我不太确定:P 我想编辑一个文件,其中包含以下文本测试 = “0”(是的,它有引号,我需要保留它)它应该从测试 = “0”修改为测试 = “1”(带引号)

另外,我需要用 sed 在文件末尾添加一些带引号的文本,例如“Thanks Quanta”(带引号)对于 php,你需要添加一个 \ 并回显引号,不知道 bash 是怎么做的

另一件事
我需要修改conf中的一行,但我不记得要替换的全部文本是什么

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

大力支持 Quanta

感谢大家的大力支持

答案1

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

另一件事我不太确定:我想编辑一个文件,其中包含以下文本测试 = “0”(是的,它有引号,我需要保留它)它应该从测试 = “0”修改为测试 = “1”(带引号)

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

另外,我需要用 sed 在文件末尾添加一些带引号的文本,例如“Thanks Quanta”(带引号)对于 php,你需要添加一个 \ 并回显引号,不知道 bash 是怎么做的

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

另一件事我需要修改conf中的一行,但我不记得要替换的全部文本是什么

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

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

答案2

就像 ptman 所说的那样,奥杰阿斯可以省去使用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更多选项。

sed与/相比,使用 Augeas 有几个优点awk

  • Augeas 拥有了解文件语法(在本例中为yum.repo语法)的解析器。如果您的正则表达式错误,您无需承担破坏文件语法的风险;
  • Augeas yum.repo 解析器了解各个yum.repo部分,因此您知道您正在编辑正确的部分;
  • Augeas 是幂等的。只有需要更改文件时,它才会对其进行更改。如果所有值都已设置,则它不会修改文件;
  • Augeas 有一个 Puppet 提供商,因此您可以轻松地在 Puppet 基础设施中实现自动化;
  • 如果参数尚不存在,Augeas 将为您创建它们。如果该部分尚不存在,Augeas 还将使用正确的语法创建它。

答案3

你可能还想看看奥杰阿斯,用于以编程方式修改配置文件的工具。它与木偶(配置管理系统),但也可以单独使用。

相关内容