当我使用 MySQL Workbench 查看结果时SELECT
,只有一个是正确的\
max@host 10:13:58: ~$ mysql -h db-master.domain.local -uuser -ppw db -e '
> SELECT
> DISTINCT i.filesourceregexp
> FROM db.ImportLogFiles i'
+------------------------------------------------+
| filesourceregexp |
+------------------------------------------------+
| ^[0-9]{8}_1062355673_merge_google_pbn\.csv$ |
| ^[0-9]{8}_8026062435_merge_google_pbn\.csv$ |
| ^[0-9]{8}_1062355673_store_visits_report\.csv$ |
+------------------------------------------------+
max@host 10:14:10: ~$ mysql -h db-master.domain.local -uuser -ppw db -e '
SELECT
DISTINCT i.filesourceregexp
FROM db.ImportLogFiles i' | tail -n +2
^[0-9]{8}_1062355673_merge_google_pbn\\.csv$
^[0-9]{8}_8026062435_merge_google_pbn\\.csv$
^[0-9]{8}_1062355673_store_visits_report\\.csv$
max@host 10:14:19: ~$
我有这些选项my.cnf
:
[client]
host = db-master
user = user
password = pass
default-character-set=utf8
为什么通过管道传输结果会tail
改变输出/字符串? (注意双\
)。
答案1
不是tail
,是管道。
mysql
当它的标准输出是终端设备时,当它供用户使用时,使用带有 ASCII 装箱输出格式的表格,并恢复为脚本编写当它不是时,例如当它是管道或常规文件时,请格式化。
你会看到同样的不同的格式化为
mysql... | cat
或者
mysql > file; cat file
另请参见影响输出格式的-r
/ --raw
、-s
/ --silent
、-B
/ --batch
、-N
// --skip-column-names
、--column-names=0
/ -H
、--html
/ -t
...。--table
如果即使输出没有发送到终端设备,您也希望获得表格输出,请添加以下-t
选项:
mysql -t ... | tail -n +2
但如果要删除标题行,只需使用-N
, 带或不带-t
。
为了从数据库中获取尽可能原始且没有标题的值,我将使用:
mysql --defaults-extra-file=/some/protected/file/with/credentials \
--batch --raw --skip-column-names -e 'select...' database
那是:
ps
不要通过在文件中传递凭据(例如您的my.cnf
)来在 的输出中公开密码--defaults-extra-file
。- 使用批模式以避免表格输出(并承认我们实际上正在对其进行批处理,这可能会产生其他影响)。
--raw
以避免逃跑。假设这些值不包含换行符,否则无法可靠地对输出进行后处理。--skip-column-names
删除标题行。