为什么将 `mysql` 管道传输到 'tail' 会改变输出格式?

Fax*_*Max 15 pipe tail mysql

当我SELECT使用 MySQL Workbench查看 a 的结果时,使用一个\是正确的

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: ~$ 
Run Code Online (Sandbox Code Playgroud)

我有这些选项my.cnf

[client] 
host = db-master 
user = user 
password = pass 
default-character-set=utf8
Run Code Online (Sandbox Code Playgroud)

为什么通过tail更改输出/字符串来传递结果?(注意双\)。

Sté*_*las 34

不是tail,是管道。

mysql当它的标准输出是终端设备时,当它是供用户使用时,使用带有 ASCII 装箱输出格式的表格,当它不是时,例如当它是管道或常规文件时,它会恢复为脚本格式。

你会看到相同的不同格式

mysql... | cat
Run Code Online (Sandbox Code Playgroud)

或者

mysql > file; cat file
Run Code Online (Sandbox Code Playgroud)

另请参阅影响输出格式的-r/ --raw-s/ --silent-B/ --batch-N/ --skip-column-names/ --column-names=0-H/ --html-t/ --table...。

如果您想要表格输出,即使输出没有转到终端设备,请添加-t选项:

mysql -t ... | tail -n +2
Run Code Online (Sandbox Code Playgroud)

但是,如果要删除标题行,只需使用-N, 带或不带-t

在这里,为了从数据库中获取尽可能原始且没有标题的值,我会使用:

mysql --defaults-extra-file=/some/protected/file/with/credentials \
      --batch --raw --skip-column-names -e 'select...' database
Run Code Online (Sandbox Code Playgroud)

那是:

  • 不要ps通过在文件中传递凭据(如您的my.cnf)来在--defaults-extra-file.
  • 使用批处理模式来避免表格输出(并承认我们实际上正在对它进行批处理,这可能会产生其他影响)。
  • --raw避免逃跑。假设这些值不包含换行符,否则无法可靠地对输出进行后处理。
  • --skip-column-names 删除标题行。

  • 这与当输出到终端时将 `ls` 输出放入列中的原因相同,但在写入管道或文件时却是单列。 (3认同)