通过 bash 脚本编辑文件

Wer*_*ulz 12 linux bash centos

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

假设我想编辑

/etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)

通过 bash 脚本

我想做的是如下

  1. 打开文件 /etc/yum.repos.d/epel.repo
  2. 查找 [epel] 部分
  3. 在 epel 部分的 line enabled=1 之后添加 line priority=10

对于第一部分,我添加了

yum install nano
nano /etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)

我的问题是如何使用 nano 使用 bash 脚本执行第二和第三部分(如果可能,如果不可能,则用 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"(带引号)

此外,我需要在文件末尾添加一些带引号的文本,例如“感谢 Quanta”(带引号)对于 php,您放置了一个带有回显引号的 \,不知道 bash 是如何完成的

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

喜欢它的听=某事;,我想修改为listen = /tmp/php5-fpm.sock;

为量子点赞

感谢大佬们的大力支持

qua*_*nta 18

sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)

-i如果需要,请指定就地编辑选项 ( )(.bak首先使用扩展名进行备份):

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)

现在我想使用 sed 执行以下操作 1.在该 conf 中找到 worker_processes 的第一次出现,并用 worker_processes 4 替换文本;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)

最后一个建议我用 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
Run Code Online (Sandbox Code Playgroud)

另一个我不确定的东西:PI 想要编辑一个文件,它的内容为 Text Testing = "0"(是的,它有引号,我需要保留它)它应该从 Testing = "0" 修改为 Testing = " 1"(带引号)

sed 's/Testing = "0"/Testing = "1"/g'
Run Code Online (Sandbox Code Playgroud)

此外,我需要在文件末尾添加一些带引号的文本,例如“感谢 Quanta”(带引号)对于 php,您放置了一个带有回显引号的 \,不知道 bash 是如何完成的

sed '$a"Werulz, you are welcome"\'
Run Code Online (Sandbox Code Playgroud)

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

喜欢它的听=某事;,我想修改为listen = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
Run Code Online (Sandbox Code Playgroud)


rap*_*ink 12

就像 ptman 说的,Augeas可以让你免于使用sed/ awk

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

如果你想把它保存在你的 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
Run Code Online (Sandbox Code Playgroud)

查看man augtool更多选项。

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

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