【问题标题】:Parsing a nginx conf file for host headers解析主机头的 nginx conf 文件
【发布时间】:2023-04-02 13:49:01
【问题描述】:

我需要有关从配置文件中提取然后重新插入特定文本块的帮助。我感兴趣的块以“server_name”开头,以“;”结尾

server_name   example.com  
              www.example.com
              anothername.co.uk; 

我认为 sed 或 awk 命令可以做到这一点,但我不确定从哪里开始。理想情况下,我希望将“example.com”、“www.example.com”和“anothername.co.uk”读入 bash 数组。

我正在制作一个 shell 脚本来控制 Web 服务器,并希望能够编辑每个站点的主机头,所以我想将主机头从文件读入一个数组,以便提示用户如果他们想删除或添加和主机。然后我想将编辑后的主机头写回文件中。

使用 Jotne 的 awk 命令,我现在可以读取主机标头。所以它只是将它们写回我需要帮助的文件。

我没有意识到,我尝试阅读的每一行的开头都有不同数量的空白。过去我们有 100 个网站是手动编辑过的。 如有任何帮助,我将不胜感激。

【问题讨论】:

  • 请编辑您的问题以包括您希望如何编辑值。 searchString 和 replacementString 是否作为参数传入?或者您是否要每次都编辑您的 shell 脚本以进行编辑。祝你好运。
  • 示例here 显示至少3 个server_name 部分。您要编辑所有这些吗?此外,该示例显示以空格分隔的条目,而您的示例是空格和返回分隔。你期待哪个?

标签: bash nginx awk sed


【解决方案1】:

这个awk 应该这样做:

arr=($(awk '/^server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);print p} /;$/ {f=0}' file))
echo ${arr[0]}
example.com
echo ${arr[1]}
www.example.com
echo ${arr[2]}
anothername.co.uk

它将所有以server_name 开头并以; 结尾的文本放入一个bash 数组中

或者您可以将它们存储在内部awk 数组中,然后将它们写入另一个文件:

awk '/^server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);a[++c]=p} /;$/ {f=0} END {for (i=1;i<=c;i++) print a[i]}' file > newfile
cat newfile
example.com
www.example.com
anothername.co.uk

【讨论】:

  • 谢谢你,我没有意识到我们在每一行的开头都有不同数量的空白,但如下改变你的喜欢似乎可以解决这个问题。 "awk '/\s*server_name/ {f=1} f {p=$NF;sub(/;$/,"",p);a[++c]=p} /;$/ {f= 0} END {for (i=1;i
  • @user2137455 /\s*server_name/ 不是一个好的解决方案。如果发现server_name 前面有一个或多个空格,它将匹配。然后你可以做/server_name/ 让它工作。最好是 /^\s*server_name/ 让它从头开始如果行。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2011-12-31
  • 2013-08-10
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多