Wer*_*ulz 12 linux bash centos
我是 bash 脚本的初学者。我想创建一个 bash 脚本,以自动方式在我的 linux 机器上安装和配置东西。
假设我想编辑
/etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)
通过 bash 脚本
我想做的是如下
对于第一部分,我添加了
yum install nano
nano /etc/yum.repos.d/epel.repo
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使用 nano 使用 bash 脚本执行第二和第三部分(如果可能,如果不可能,则用 sed 显示我)
此外,在某些时候,我将不得不修改文件中的变量,例如
我知道它要求很高,但我需要为服务器管理新手的朋友创建这个。不幸的是,我没有时间从头开始学习 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=0
来enabled=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
:
yum.repo
语法)的解析器。如果您的正则表达式错误,您将不会冒破坏文件语法的风险;yum.repo
部分,所以你知道你正在编辑正确的部分;