尽可能简单地说,在具有bash / sed / awk和基本OS命令的Linux中,我试图在文本文件中创建一个包含多个标题的列表,并在它们下面带有一串字符串(服务器名)。然后,我希望能够运行一个脚本,并在运行时作为选项/参数传递的特定标题下,对每个条目运行各种任务。
该文本文件的示例如下:(这些条目应在有问题的标题下的单个列中排序,但我无法使其以这种方式显示在此页面上。)
[main_server_list]
Jupiter
Saturn
Thisguy
Thatguy
BuffalO
randomspite
coffeebinge
[alternate_server_list]
Jupiter
Saturn
[Tertiary_server_list]
Thisguy
Thatguy
coffeebinge
[Enough_already]
BuffalO
randomspite
因此,基本上,如果我想将文件复制到所有机器的目录中,则需要执行以下操作:
# bash maincopyscript.sh [main_server_list]
并且“循环”会知道要在其上安装服务器的服务器列表将是[main_server_list]标头下的每个条目,但是忽略任何其他标头下的其他所有内容。
同样,我也希望能够做到:
# bash maincopyscript.sh [Tertiary_server_list]
并且期望具有相同的功能,只是这次,仅对[Tertiary_server_list]标头下的条目运行“循环”,然后完成操作。
最后,如果希望的话,我希望能够以任意顺序指定多个标头。如:
# bash maincopyscript.sh [Enough_already] [alternate_server_list]
然后,它应该仅在这两个标题下的条目上运行脚本中指定的操作,然后完成。
希望您能理解这个想法,基本上是一种主要利用bash / sed / awk做到这一点的方法。(如果需要,甚至可以使用其他工具)
是的,我了解到ansible / puppet / chef也可以帮助我获得这些结果,但是无论如何,我都有具体的理由想要这样做。我尝试搜索一个小时或2个关于此内容的现有帖子,但找不到一个帖子,因此最终决定问我一个问题。任何帮助,将不胜感激!
(奖金,如果有人还可以向我展示如何按字母顺序在每个标题下放置条目,同时使标题和组自身保持完全相同的格式,那也将是一件好事!)
您可以使用awk从标题下方提取名称,然后将其放入数组 变量中,然后使用遍历数组for
。此处的脚本从命令行获取模式。
#!/bin/bash
patt=$1
if [ -z "$patt" ] ; then echo "need an argument" ; exit 1 ; fi
A=( $(awk '/^\[/ {p = 0};
/^\['"$patt"'\]/ {p=1; next}
p && !/^ *$/ ;' < servers ) )
for x in "${A[@]}" ; do
echo doing something with "$x"
done
所以,
$ bash for_all.sh alternate_server_list
doing something with Jupiter
doing something with Saturn
在awk
程序中:
/^\[/ {p = 0}
-如果行中的第一个字符是开括号,则将p设置为零;
/^\['"$patt"'\]/ {p=1; next}
-如果我们匹配模式,则将p设置为一个,然后跳至下一行。注意,该模式是从shell变量提供给awk的,因此它将被视为正则表达式。引号有点有趣,因为部分代码用单引号引起来,然后变量用双引号引起来,然后更多的代码用单引号引起来。喜欢'foo' "$var" 'bar'
但没有空格。
p && !/^ *$/
-如果设置了p且行不为空(仅在开始和结束之间留有空格),请打印它(默认操作)。
哦,而且,如果您的列表项包含任何有趣的东西(例如空格),这将崩溃并燃烧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句