Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql postgres中用于脚本编写的列表命令的替代方法_Postgresql_Postgresql 9.1_Psql - Fatal编程技术网

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元字符 当心你还有