【问题标题】:How to save a postgres query to a file from a remote computer如何将 postgres 查询从远程计算机保存到文件
【发布时间】:2012-08-28 02:18:25
【问题描述】:

我有一个从 postgres 数据库输出一些数据的脚本:

#!/bin/bash

dbname="inventory"
username="postgres"
NOW=$(date +"%d-%m-%Y-%H%M%S")
OUTPUT="output.$NOW"

psql $dbname $username << EOF
\o | cat >> $OUTPUT
select count(*) from component;
select * from product where procode='AAA';
\q
\o
EOF

如果我在本地机器上运行它,这会很高兴地将我需要的数据导出到一个文本文件中。

现在我想为 10 台远程计算机做同样的事情,并将输出存储在我运行脚本的机器上的一个文件中。我有以下代码将从远程机器上获取一些信息,但我还需要将上面的 postgres 数据添加到下面的 $FILE_OUT 中:

#!/bin/bash

NOW=$(date +"%d-%m-%Y-%H%M%S")
dbname="inventory"
username="postgres"

echo "Enter the file name"
read FILE_IN
FILE_OUT="invcheck.$NOW"

for i in $(cat $FILE_IN); do
echo $i >> $FILE_OUT

ssh user@$i "ps -efw | grep TRADINGTIMEPLUS /opt/jrms/jrms.ini" >> $FILE_OUT

我试图将 postgres 代码放在一行中:

ssh rmsasi@hj$i "psql $dbname $username << EOF \o | cat >> $FILE_OUT select * from component where code='1000';\q;\o; EOF"

但我收到错误,并且 postgres 数据未包含在 $FILE_OUT 中

psql: warning: extra option o ignored
cat: from: No such file or directory
cat: component: No such file or directory
cat: where: No such file or directory
cat: code=1000: No such file or directory
bash: line 1: q: command not found
bash: line 1: o: command not found
bash: line 1: EOF: command not found

我只是脚本新手,所以希望我只是缺少一些简单的东西。

提前致谢,如果有更好的方法来做我想要实现的目标,我很感激任何指点。

【问题讨论】:

  • 感谢您在无需询问的情况下首次显示代码 :-)。
  • \o | cat &gt;&gt; $OUTPUT 看起来很奇怪。为什么不只是\o $OUTPUT? (编辑:DUH,你在追加。没关系。)

标签: bash postgresql


【解决方案1】:

psql\ 命令以换行符结束,而不是分号。有点像 IMO。

因此,您的命令中需要换行符。在 shell 的带引号的文字中允许使用文字换行符,因此您可以将它们插入命令中,但最好将您的 here-document 放在本地并通过 ssh 的标准输入将其发送到 psql 的标准输入。不过,这仍会将输出留在远程机器上:

ssh rmsasi@hj$i "psql $dbname $username" << __EOF__
 \o | cat >> $FILE_OUT
SELECT * from component where code='1000';
\q
\o
__EOF__

最好从psql 的标准输出中读取或重定向它,而不是使用\o 命令;这样输出就会回到 ssh 会话,您可以在本地重定向它:

echo "SELECT * from component where code='1000';" |\
ssh rmsasi@hj$i >> $FILE_OUT \
  "psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password $dbname $username"

或者,您可以让 psql 通过网络从其他计算机连接。

由于您是从 bash 驱动 psql,您可能想知道您可以与 a co-process 交互地执行此操作。您也不需要将输出重定向到这样的临时文件;只需禁止 psql 打印提示和标题(请参阅链接答案),您可以简单地从 psql 的标准输出中读取结果。

【讨论】:

  • 感谢克雷格这解决了我的问题,我很欣赏额外的信息 - 解决您的问题并学习新知识总是很高兴。我从某处的网站上捡到的那只猫,但我删除了它,它按照您的建议运行良好。
  • @Rob 很高兴为您提供帮助。我喜欢 ssh 对网络脚本的强大功能。
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多