小编Hel*_*enH的帖子

使用bash数组将表转换为ini文件

我在采用这种格式的输出文件(“inventory.list”)时遇到了挑战:

hostname1.env1.domain   | abc  | environment1
hostname2.env1.domain   | abc  | environment1
hostname3.env2.domain   | abc  | environment2
hostname4.env2.domain   | abc  | environment2
hostname5.env1.domain   | def  | environment1
hostname6.env2.domain   | def  | environment2
(6 rows)
Run Code Online (Sandbox Code Playgroud)

并以不同的格式将其写到另一个文件中:

[abc.environment1]
hostname1.env1.domain
hostname2.env1.domain

[abc.environment2]
hostname3.env2.domain
hostname4.env2.domain

[def.environment1]
hostname5.env1.domain

[def.environment2]
hostname6.env2.domain
Run Code Online (Sandbox Code Playgroud)

abcdef是分配给服务器的角色,每个角色可以有多个服务器,以及同名但在不同环境中的角色。我必须将每个主机名分成唯一的 [role.environment] 组,另外,完全删除文件的最后一行,即行计数(该文件是 sql 查询的输出)。

我可以读取文件,去除管道和空格并分配/输出角色/环境分组,没问题:

#! /bin/bash
while IFS='| ' read -r certname role env; do
  printf '%s\n' "[""$role"".""$env""]"
done < "/tmp/inventory.list"
Run Code Online (Sandbox Code Playgroud)

...它巧妙地为我提供了角色/环境组名称:

[abc.environment1]
[abc.environment2]
[def.environment1]
[def.environment2]
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何打印出链接到每个组名下的每个角色/环境组的主机名,我也无法弄清楚如何让我的脚本忽略最后一行计数行。我猜我必须进一步将我的角色和环境字段(第二个和第三个字段)分配给它自己的数组,然后引用它来获取链接到每个唯一分组的主机名,但我不知道如何实现这一点。请问有人可以建议吗?

bash text-processing

5
推荐指数
2
解决办法
991
查看次数

如何将 bash 脚本中的长 psql 命令拆分为多行

我有一个很长的 psql 命令要在 bash shell 脚本中执行,我想知道将它分成几行的正确方法是什么?标准的 Unix 脚本“分割线”反斜杠字符不起作用。当然,在 postgres 环境中,您可以一行接一行地继续执行,并且在您输入结束分号之前不会处理该命令,但是您不在 shell 脚本中使用它。

我的命令是这样的:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list
Run Code Online (Sandbox Code Playgroud)

我不想更改命令,手动输入时一切正常,但我需要知道将其转换为分割线条目的正确方法,例如:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = …
Run Code Online (Sandbox Code Playgroud)

shell-script postgresql

5
推荐指数
1
解决办法
1万
查看次数

将条目添加到关联数组时出现“错误的数组下标”错误

我想我最好为此开始一个新的查询,因为我原来的查询已得到完全解答(谢谢!)。

我有两个文件,它们都是 postgresql 命令的输出。第一个 (/tmp/inventory.list) 是我原始查询使用 bash arrays 将表转换为 ini 文件的主题,为此我使用 @choroba 善意建议的 array 命令。鉴于我的第二个文件(/tmp/inventory2.list)的格式与第一个文件非常相似,我认为我可以调整数组脚本来类似地处理这个文件,但我显然把一些事情搞砸了。

我的输入文件 /tmp/inventory2.list 的格式为:

environment1 | hostname1.environment1.domain
environment1 | hostname2.environment1.domain
environment1 | hostname3.environment1.domain
environment2 | hostname4.environment2.domain
environment2 | hostname5.environment2.domain
environment3 | hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)

必须以分组格式读入并写入另一个文件:

[environment1]
hostname1.environment1.domain
hostname2.environment1.domain
hostname3.environment1.domain

[environment2]
hostname4.environment2.domain
hostname5.environment2.domain

[environment3]
hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)

环境分组之间必须有行空间,组名称必须按字母顺序显示,主机名必须在组内按字母顺序排序。每个环境组可能有多个主机名,但每个组只能显示一次。

让事情变得复杂的是,输入文件末尾有一个空行,我无法让我的 postgresql 查询省略它(-t 或 --tuples-only 删除通常写在末尾的行计数行,但不会' t 删除最后一个空行),因此需要将其删除并且不写入新的输出文件。

我尝试调整 @choroba 的数组命令来读取此文件并正确输出它,但是尽管它对于我的第一个文件完美地工作,但我的调整不起作用。我有:

  1 #! /bin/bash
  2
  3 unset -v envs
  4 unset -v hosts
  5 declare -A envs
  6 declare -A hosts …
Run Code Online (Sandbox Code Playgroud)

bash array

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

bash ×2

array ×1

postgresql ×1

shell-script ×1

text-processing ×1