为什么将“mysql”管道连接到“tail”会改变输出格式?

为什么将“mysql”管道连接到“tail”会改变输出格式?

当我使用 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删除标题行。

相关内容