¿Por qué la tubería `mysql` a 'tail' cambia el formato de salida?

¿Por qué la tubería `mysql` a 'tail' cambia el formato de salida?

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? (nótese el doble \).

Respuesta1

No lo es tail, son las tuberías.

mysqlutiliza una tabla con formato de salida de cuadro ASCII cuando su salida estándar es un dispositivo terminal, cuando está destinado a un usuario, y vuelve a unsecuencias de comandosformato cuando no lo es, como cuando es una tubería o un archivo normal.

Verías lo mismodiferenteformato con

mysql... | cat

o

mysql > file; cat file

Consulte también -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 objetivo es eliminar la línea del encabezado, simplemente use -N, con o sin -t.

Aquí, para obtener los valores de la base de datos lo más crudos posible y sin encabezado, usaría:

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

Eso es:

  • No exponga la contraseña en la salida de pspasando las credenciales en un archivo (como su my.cnf) con --defaults-extra-file.
  • utilizar ellotemodo para evitar la salida tabular (y reconocer el hecho de que en realidad lo estamos agrupando, lo que puede tener otras implicaciones).
  • --rawpara evitar elescapando. Suponiendo que los valores no contengan nuevas líneas, de lo contrario la salida no podría posprocesarse de manera confiable.
  • --skip-column-namespara eliminar la línea del encabezado.

información relacionada