17

我想做以下mysql -uuser -ppass -h remote.host.tld database < script.sql

其中script.sql包含以下内容

SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'

我希望将 CSV 输出定向到标准输出。原因是使用 an 运行此查询INTO OUTFILE 'blah.csv'会将文件保存在远程主机上。我希望将文件保存在本地主机上。

如果我可以将标准输出重定向到一个文件,那就太棒了。

4

3 回答 3

4

上面的答案似乎并没有完全回答原始问题,我也不确定这是否也可以,但希望这可能对某人有所帮助:

请参阅如何以 CSV 格式输出 MySQL 查询结果?很多关于如何的评论sed。例如,基于原始参数,以下可能就足够了:

mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e "SELECT * FROM webrecord_wr25mfz_20101011_175524;" | sed 's/\t/,/g' 2>&1

这类似于上面的答案,但重定向到stdout而不是blah.csv.

但是,(虽然不确定如果您需要保留标签是否可行,但有很多方法可以解决这个问题),我使用https://stackoverflow.com/a/2543226/2178980正确转义双引号和转换为逗号分隔:

mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e "SELECT * FROM webrecord_wr25mfz_20101011_175524;" | perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g' 2>&1
  • 执行sql "SELECT * FROM webrecord_wr25mfz_20101011_175524;"via mysql(此输出将以制表符分隔)
  • 通过管道转换为逗号分隔perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g'
  • 有输出去stdout通过附加2>&1
于 2019-11-15T18:36:35.753 回答
2

部分是对MySQL SELECT INTO OUTFILE 到不同服务器的重复问题。FIELDS TERMINATED BY没有就不能使用into outfile

一个(不那么优雅的)替代方法是使用--batch选项生成制表符分隔的输出并 sedding 标准输出。像这样的东西:

mysql --batch -uuser -ppass -h remote.host.tld database < stack.sql | sed 's/\t/,/g' > blah.csv

请注意--batch转义特殊字符,因此根据您拥有的数据及其可预测性,您可能需要更改 sed

于 2019-07-14T13:38:21.733 回答
0

尝试这个:mysql -uuser -ppass -h remote.host.tld database < script.sql 2> blah.csv

这将重定向标准错误

于 2010-10-15T22:08:21.843 回答