bash - 从逗号分隔的文件中删除主机

标签 bash nagios

我正在尝试编写一种从 Nagios Core 的主机组文件中删除主机的方法。 主机组文件的格式为:

server1,server2,server3,server4

删除服务器时,我不仅需要能够删除服务器,还需要能够删除它后面的逗号。所以在我上面的例子中,如果我删除 server2,文件将产生如下结果

server1,server3,server4

所以我用谷歌搜索并测试了以下内容,它可以删除 server2 和它后面的逗号(我不知道 b 的确切用途)

sed -i 's/\bserver2\b,//g' myfile

我想要做的是将主机名列表提供给一个小脚本,以删除一堆主机(及其后面的逗号),其中包含类似于以下内容的内容。问题在于放置像 $x 这样的变量会破坏脚本,因此什么也不会发生。

#!/bin/ksh
for x in `cat /tmp/list`
do
sed -i 's/\b${x}\b,//g' myfile
done

我认为我非常接近这里的解决方案,但需要一些帮助。非常感谢您的帮助。

最佳答案

使用单引号告诉 shell 不要替换 ${x} - 如果你想用谷歌搜索它,它会关闭变量插值。 https://www.tldp.org/LDP/abs/html/quotingvar.html .因此,请在 sed 替换字符串周围使用双引号:

while read -r x; do sed -i "s/\b${x},\b//g" myfile; done < /tmp/list

但由于最后一个字段后面没有逗号,运​​行两个 sed 命令可能是个好主意,一个查找\bword,\b,另一个查找 ,word$ - 其中\b 是一个单词边界,$ 是行尾。

while read -r x; do sed -i "s/\b${x},\b//g" myfile; sed -i "s/,${x}$//" myfile ; done < /tmp/list

另一个可能的边界条件 - 如果您只有 server2 单独在一行上并且这就是您要删除的内容怎么办?或许添加第三个 sed,但是这个会留下一个空行,您可能想删除它:

while read -r x
do
  sed -i "s/\b${x},\b//g" myfile  # find and delete word,
  sed -i "s/,${x}$//" myfile      # find and delete ,word
  sed -i "s/^${x}$//" myfile      # find word on a line by itself
done < t

关于bash - 从逗号分隔的文件中删除主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61335099/

相关文章:

bash - AWK -F 打印除最后一条记录之外的所有记录

linux - 什么是零信号?

支持书签的 Linux 文本编辑器

bash - 在 shell 脚本中只包含一次脚本

python - mp3 音频从交互式 python 播放,但不是从 bash 播放

bash - 如何使用 Bash 遍历日期?

python - 如何在 python + linux 中监听端口并行

centos - 如何在不使用 Apache 和 PHP 的情况下在一台 VM 上安装 Nagios 以检查另一台 VM(客户端)的特定统计信息?

windows - NSClient++ 未安装在 Windows 中

mysql - mysql配置nagios的方法