为什么用管道“尾巴”改变线的内容?


14

当我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: ~$ 

我在这些选项中my.cnf

[client] 
host = db-master 
user = user 
password = pass 
default-character-set=utf8

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


如果通过另一个命令进行管道传输,您将获得相同的输出,对吗?例如mysql ... | head还是mysql ... | grep 8
terdon

感谢您提高我的英语水平。headgrep 802* \ * max@host 10:50:48: ~$ mysql -V mysql Ver 14.14 Distrib 5.5.55, for debian-linux-gnu (x86_64) using readline 6.3
翻倍

您正在使用哪条尾巴?可以分享tail --version
amisax

@amisax我的尾巴是tail (GNU coreutils) 8.23但我的grep或头部也有相同的问题
FaxMax

我的重击是GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)uname -a结果:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Answers:


32

不是tail,是管道。

mysql当stdout是终端设备时(针对用户),使用带有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 删除标题行。

1
选项-r --column-names=0解决了我的问题,坦克
FaxMax

3
这与ls将输出发送到终端时将输出放在列中的原因相同,但是在写入管道或文件时将其放在单列中。
Barmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.