AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 419533
Accepted
Werulz
Werulz
Asked: 2012-08-22 00:02:14 +0800 CST2012-08-22 00:02:14 +0800 CST 2012-08-22 00:02:14 +0800 CST

通过 bash 脚本编辑文件

  • 772

我是 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. 在一行中添加文本。功能=到功能=“文本1”,“文本2”
  4. 向文件中添加一些文本并保存(使用 nano)

我知道它要求很高,但我需要为一个在服务器管理方面一窍不通的朋友创建这个。不幸的是,我没有时间从头开始学习 bash 脚本,因为我的考试临近了。我将使用您的示例来编写脚本。


伙计们感谢所有回复我已经成功完成了大部分 bash 脚本

但是我还有另一个问题 假设我想使用 sed 修改 nginx.conf 我们将处理 worker_processes
现在我想使用 sed 执行以下操作 1.在该 conf中 找到第一次出现worker_processes 并将文本替换为worker_processes 4;

此处特别说明:这只是一个例子。可能会发生 conf 包含 worker_processes 1;. 这是困难的部分。我想要一个 sed 命令来找到单词worker_processes的第一个 wHOLE 匹配案例,删除找到该单词的文本行并粘贴 到那里,然后保存文件。这是我在编辑文件时最可靠的方法(没有破坏任何 conf 的风险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 ,这将破坏服务器。任何人都可以提出更好的代码。


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

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

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

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

对 up quanta 赞不绝口

感谢你们的支持

linux
  • 3 3 个回答
  • 23952 Views

3 个回答

  • Voted
  1. Best Answer
    quanta
    2012-08-22T00:08:56+08:002012-08-22T00:08:56+08:00
    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.repoenabled=0

    在这里为你:

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

    另一个我不确定的东西:PI 想编辑一个文件,它有这个作为文本测试 =“0”(是的,它有引号,我需要保留它)它应该从测试 =“0”修改为测试 =“ 1"(带引号)

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

    我还需要在文件末尾添加一些带引号的文本,例如“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;/'
    
    • 18
  2. raphink
    2012-08-22T01:34:03+08:002012-08-22T01:34:03+08:00

    正如 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 也会使用正确的语法创建它。
    • 12
  3. ptman
    2012-08-22T00:26:54+08:002012-08-22T00:26:54+08:00

    您可能还想查看Augeas,用于以编程方式修改配置文件的工具。它与Puppet (一种配置管理系统)结合使用非常强大,但也可以单独使用。

    • 2

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve