¿Por qué la tubería a 'cola' cambia el contenido de una línea?

14

Cuando veo el resultado de un SELECTcon MySQL Workbench, es correcto con un solo \

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

Tengo estas opciones en my.cnf:

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

¿Por qué canalizar el resultado tailcambia la salida / cadena? (tenga en cuenta el doble \).

FaxMax
fuente
Obtiene el mismo resultado si canaliza a través de otro comando, ¿verdad? Por ejemplo mysql ... | heado mysql ... | grep 8?
terdon
Gracias por mejorar mi inglés. heady grep 802también doblar el * \ * 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
FaxMax
¿Qué cola estás usando? puedes compartir la salida detail --version
amisax
@amisax mi cola es tail (GNU coreutils) 8.23pero tengo el mismo problema con grep o head
FaxMax
mi golpe es GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)y uname -aresultados:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Respuestas:

32

No es tail, es la tubería.

mysqlutiliza una tabla con formato de salida de boxeo ASCII cuando su stdout es un dispositivo terminal, cuando está destinado a un usuario, y vuelve a un formato de secuencia de comandos cuando no lo es, como cuando se trata de una tubería o un archivo normal.

Vería el mismo formato diferente con

mysql... | cat

o

mysql > file; cat file

Vea también los -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table... que afectan el formato de salida.

Si desea la salida tabular incluso cuando la salida no va a un dispositivo terminal, agregue la -topción:

mysql -t ... | tail -n +2

Pero si el punto es eliminar la línea de encabezado, simplemente use -N, con o sin -t.

Aquí para obtener los valores de la base de datos tan crudos como sea posible y sin encabezado, usaría:

mysql --defaults-extra-file=/some/protected/file/with/credentials \
      --batch --raw --skip-column-names -e 'select...' database

Es decir:

  • no exponga la contraseña en la salida pspasando las credenciales en un archivo en su lugar (como usted my.cnf) con --defaults-extra-file.
  • use el modo por lotes para evitar el resultado tabular (y reconozca el hecho de que en realidad lo estamos procesando por lotes, lo que puede tener otras implicaciones).
  • --rawpara evitar el escape . Suponiendo que los valores no contienen nuevas líneas, de lo contrario, la salida no podría procesarse de manera confiable.
  • --skip-column-names para eliminar la línea del encabezado.
Stéphane Chazelas
fuente
1
las opciones -r --column-names=0resolvieron mi problema, tanques
FaxMax
3
Esta es la misma razón por la que la lssalida se coloca en columnas cuando la salida va a una terminal, pero es una sola columna cuando se escribe en una tubería o archivo.
Barmar