Postgresql postgres中用于脚本编写的列表命令的替代方法
不幸的是,Postgresql postgres中用于脚本编写的列表命令的替代方法,postgresql,postgresql-9.1,psql,Postgresql,Postgresql 9.1,Psql,不幸的是,psql-l使用换行符 示例 请参阅输出并注意“访问”列 数据库清单 姓名|所有者|编码|校对| Ctype |访问权限 -------------------------+------------+----------+-------------+-------------+----------------------- firstdb | postgres | UTF8 | de| u de.UTF-8 | de|u de.UTF-8| secnddb | scnduser | U
psql-l
使用换行符
示例
请参阅输出并注意“访问”列
数据库清单
姓名|所有者|编码|校对| Ctype |访问权限
-------------------------+------------+----------+-------------+-------------+-----------------------
firstdb | 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 | scnduser | UTF8 | de| u de.UTF-8 | de|u de.UTF-8|
博士后|博士后| UTF8 |得UTF-8 |得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
firstdb | 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 | scnduser | UTF8 | de| u de.UTF-8 | de|u de.UTF-8|
博士后|博士后| UTF8 | UTF-8学院| 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?所有相关数据都在pg_数据库
和pg_用户
看
在shell上,用psql命令包装:
psql -AStnq -c "select [...]"
返回正确的格式
template1|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres}
template0|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres}
postgres|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
firstdb|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
secnddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
thrddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
模板1 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |{=c/postgres,postgres=CTc/postgres}
模板0 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |{=c/postgres,postgres=CTc/postgres}
博士后|博士后| UTF8 | UTF-8学院| UTF-8学院|
firstdb | 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 | scnduser | UTF8 | de| u de.UTF-8 | de|u de.UTF-8|
所有相关数据都在
pgu数据库
和pgu用户
看
在shell上,用psql命令包装:
psql -AStnq -c "select [...]"
返回正确的格式
template1|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres}
template0|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres}
postgres|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
firstdb|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
secnddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
thrddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
模板1 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |{=c/postgres,postgres=CTc/postgres}
模板0 | postgres | UTF8 | de|u de.UTF-8 | de|u de.UTF-8 |{=c/postgres,postgres=CTc/postgres}
博士后|博士后| UTF8 | UTF-8学院| UTF-8学院|
firstdb | 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 | scnduser | UTF8 | de| u de.UTF-8 | de|u de.UTF-8|
有趣的问题。你正在被ACL条目中的硬换行代码咬到。顺便说一句,这些并不是它们出现的唯一地方,只是最常见的地方 使用空字节记录 与其避免换行符,为什么不使用不同的记录分隔符呢?空字节(
\0
)可能是好的;这就是-0
选项的用途。不过,只有当您的客户端能够处理空字节时,它才有用;适用于xargs-0
,不适用于其他很多东西。空字节的便利之处在于它不会出现在psql
的输出中,否则就不会有冲突的风险gawk
确实支持空分隔记录,尽管它的文档记录不足
试试看,例如:
psql -Atlqn -0 | gawk -vRS=$'\0' '{ gsub("\n", " "); print }
它用空格替换数据库名称(是的,它们可以出现在那里!)、ACL条目等中的换行符
使用不同的记录
或者,使用-R
,例如-R'!'
或-R'--分隔符--'
或任何易于解析且不可能出现在输出中的内容
自己查询目录,转义字符串
根据您需要的信息,您也可以直接查询目录或information\u schema
。您仍然需要处理有趣的字符,因此您可能需要一个regexp来避免任何有趣的事务
换行符和shell元字符
注意,你仍然需要处理意外的换行;考虑一下当某个“@”$ @这样做时会发生什么:
CREATE DATABASE "my
database";
是的,这是一个合法的数据库名称。这两个国家也是如此:
CREATE DATABASE "$(rm -rf /gladthisisnotroot);";
CREATE DATABASE "$(createuser -l -s my_haxxor -W top_secret)"
是的,两者都是合法的数据库名称。是的,如果你不正确地转义shell元字符,那真的非常非常糟糕。你犯了错误,以root用户或
postgres
用户身份运行shell脚本,他们感觉不好。有趣的问题。你正在被ACL条目中的硬换行代码咬到。顺便说一句,这些并不是它们出现的唯一地方,只是最常见的地方
使用空字节记录
与其避免换行符,为什么不使用不同的记录分隔符呢?空字节(\0
)可能是好的;这就是-0
选项的用途。不过,只有当您的客户端能够处理空字节时,它才有用;适用于xargs-0
,不适用于其他很多东西。空字节的便利之处在于它不会出现在psql
的输出中,否则就不会有冲突的风险gawk
确实支持空分隔记录,尽管它的文档记录不足
试试看,例如:
psql -Atlqn -0 | gawk -vRS=$'\0' '{ gsub("\n", " "); print }
它用空格替换数据库名称(是的,它们可以出现在那里!)、ACL条目等中的换行符
使用不同的记录
或者,使用-R
,例如-R'!'
或-R'--分隔符--'
或任何易于解析且不可能出现在输出中的内容
自己查询目录,转义字符串
根据您需要的信息,您也可以直接查询目录或information\u schema
。您仍然需要处理有趣的字符,因此您可能需要一个regexp来避免任何有趣的事务
换行符和shell元字符
当心你还有