不幸的是psql -l使用换行符
例子
参见输出并考虑“访问”列
数据库列表
名称|所有者|编码|整理| Ctype |访问权限
-------------------------+------------+----------+-------------+-------------+-----------------------
第一个数据库| postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
安全数据库|屏蔽线| UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
thrddb |屏蔽线| UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
邮政|邮政| UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
模板0 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |=c/postgres+
|| | | | postgres=CTc/postgres
模板1 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |=c/postgres+
|| | | | postgres=CTc/postgres
(6行)
暗示即使有选择,我也不能忘记:
$psql-Atlqn
第一个数据库| postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
secnddb | scnduser | UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
thrddb |屏蔽线| UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
邮政|邮政| UTF8 | de|u de.UTF-8 | de|u de.UTF-8|
模板0 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |=c/postgres
postgres=CTc/postgres
模板1 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |=c/postgres
postgres=CTc/postgres
问题是,有没有另一种方法可以以同样的方式获取数据库列表\list打印它,以便我可以在脚本中使用它进行解析,例如awk?

最佳答案

有趣的问题。你被ACL条目中的硬换行程序咬伤了。这不是他们唯一可以出现的地方,只是最常见的。
使用空字节记录
与其试图避免换行,为什么不使用不同的记录分隔符?空字节(\0)可能很好;这就是-0选项的作用。不过,只有当您的客户机可以处理空字节时,它才有用;这对xargs -0有好处,但对许多其他东西没有好处。空字节的好处是它不会出现在psql的输出中,否则就不会有冲突的风险。gawk确实支持空分隔记录,尽管它的文档记录严重不足。
尝试,例如:

psql -Atlqn -0  | gawk -vRS=$'\0' '{ gsub("\n", " "); print }

它替换了数据库名称中的换行符(是的,它们可以出现在那里!),带有空格的ACL条目等。
使用不同的记录
或者,使用-R,例如-R '!'-R '--SEPARATOR--'或任何易于解析且不太可能出现在输出中的内容。
自己查询目录,转义字符串
根据需要的信息,您也可以直接查询目录或information_schema。你仍然需要处理有趣的字符,所以你可能想要一个regexp来逃避任何有趣的业务。
换行符和shell元字符
请注意,您仍然必须处理意外的换行符;请考虑当某些@#$@执行此操作时会发生什么情况:
 CREATE DATABASE "my
 database";

是的,这是合法的数据库名。以下两项也是:
 CREATE DATABASE "$(rm -rf /gladthisisnotroot);";

 CREATE DATABASE "$(createuser -l -s my_haxxor -W top_secret)"

是的,两个都是合法的数据库名称。是的,如果你不能正确地转义shell元字符,你就犯了错误,把shell脚本作为根用户或postgres用户运行,他们感觉不太好。

关于postgresql - Postgres中的list命令的替代脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21259279/

10-13 08:16