Por que o piping para 'tail' altera o conteúdo de uma linha?

14

Quando vejo o resultado de um SELECT com o MySQL 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 o piping do resultado através de tail altera a saída / string? (observe o duplo \ ).

    
por FaxMax 23.11.2017 / 10:24

1 resposta

31

Não é tail , é o encanamento.

mysql usa uma tabulação com o formato de saída de boxe ASCII quando seu stdout é um dispositivo terminal, quando é destinado a um usuário, e é revertido para um formato script quando não é, como quando é um pipe ou um arquivo normal.

Você veria o mesmo formato diferente com

mysql... | cat

ou

mysql > file; cat file

Veja também o -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ê quiser a saída tabular mesmo quando a saída não for para um dispositivo de terminal, adicione a opção -t :

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

Mas se o objetivo for remover a linha de cabeçalho, use apenas -N , com ou sem -t .

Aqui para obter os valores do banco de dados o mais bruto 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

Isto é:

  • não exponha a senha na saída de ps passando as credenciais em um arquivo (como você my.cnf ) com --defaults-extra-file .
  • use o modo lote para evitar a saída tabular (e reconheça o fato de que estamos, na verdade, em lotes, o que pode ter outras implicações).
  • --raw para evitar o escapar . Supondo que os valores não contenham novas linhas, caso contrário, a saída não pode ser processada de forma confiável.
  • --skip-column-names para remover a linha de cabeçalho.
por 23.11.2017 / 10:59

Tags