Por que canalizar `mysql` para 'tail' altera o formato de saída?

Por que canalizar `mysql` para 'tail' altera o formato de saída?

Quando vejo o resultado de um SELECTMySQL Workbench, está correto com um único\

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

Eu tenho essas opções em my.cnf:

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

Por que canalizar o resultado tailaltera a saída/string? (observe o duplo \).

Responder1

Não é tail, é a tubulação.

mysqlusa um formato de saída tabular com boxing ASCII quando seu stdout é um dispositivo terminal, quando é destinado a um usuário e reverte para umscriptformato quando não é, como quando é um canal ou um arquivo normal.

Você veria o mesmodiferenteformato com

mysql... | cat

ou

mysql > file; cat file

Veja também -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0​​, -H/ --html, -t/ --table... que afetam o formato de saída.

Se você deseja a saída tabular mesmo quando a saída não vai para um dispositivo terminal, adicione a -topção:

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

Mas se o objetivo é remover a linha do cabeçalho, basta usar -N, com ou sem -t.

Aqui, para obter os valores do banco de dados o mais brutos possível e sem cabeçalho, eu usaria:

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

Aquilo é:

  • não exponha a senha na saída pspassando as credenciais em um arquivo (como o seu my.cnf) com --defaults-extra-file.
  • use olotemodo para evitar a saída tabular (e reconhecer o fato de que estamos realmente agrupando-a em lote, o que pode ter outras implicações).
  • --rawpara evitar oescapando. Supondo que os valores não contenham novas linhas, caso contrário a saída não poderá ser pós-processada de forma confiável.
  • --skip-column-namespara remover a linha do cabeçalho.

informação relacionada