我是 Bash 脚本的初学者。我想创建一个 Bash 脚本以自动方式在我的 Linux 机器上安装和配置东西。
假设我想编辑
/etc/yum.repos.d/epel.repo
通过 bash 脚本
我想要做的如下
- 打开文件 /etc/yum.repos.d/epel.repo
- 查找 [epel] 部分
- 在 epel 部分中,在 enabled=1 行后面添加一行 priority=10
对于第一部分我添加了
yum install nano
nano /etc/yum.repos.d/epel.repo
我的问题是如何使用 nano 通过 bash 脚本完成第二部分和第三部分(如果可能的话,如果不可能的话,用 sed 给我看看)
另外在某些时候我必须修改文件中的变量例如
- 启用 = 0 至启用 = 1
- 测试 = “1” 至 测试 = “0”
- 在一行中添加文本。functions = to function =“text1”,“text2”
- 在文件中添加一些文本并保存(使用 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=0
为enabled=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 还将使用正确的语法创建它。