Por que a tubulação para 'cauda' altera o conteúdo de uma linha?

14

Quando visualizo o resultado de um SELECTcom o MySQL Workbench, ele 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 através da tailalteração da saída / string? (observe o dobro \).

FaxMax
fonte
Você obtém a mesma saída se passar por outro comando, certo? Por exemplo mysql ... | headou mysql ... | grep 8?
terdon
Obrigado por melhorar meu inglês. heade grep 802também dobre o * \ * 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 23/11
qual cauda você está usando? você pode compartilhar a saída detail --version
amisax 23/11
@amisax minha cauda é tail (GNU coreutils) 8.23, mas eu tenho o mesmo problema com grep ou cabeça
FaxMax
meu bash é GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)e 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 23/11

Respostas:

32

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

mysqlusa um tabular com formato de saída de boxe ASCII quando seu stdout é um dispositivo terminal, quando se destina a um usuário, e reverte para um formato de script quando não é, como quando é um pipe ou um arquivo comum.

Você veria o mesmo formato diferente com

mysql... | cat

ou

mysql > file; cat file

Veja também os -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 for para um dispositivo terminal, adicione a -topção:

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

Mas se o objetivo é remover a linha do cabeçalho, use -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

Isso é:

  • não exponha a senha na saída pspassando as credenciais em um arquivo (como você my.cnf) com --defaults-extra-file.
  • use o modo em lote para evitar a saída tabular (e reconheça o fato de que estamos realmente enviando em lotes o que pode ter outras implicações).
  • --rawpara evitar a fuga . Supondo que os valores não contenham novas linhas, caso contrário, a saída não poderá ser pós-processada com confiabilidade.
  • --skip-column-names para remover a linha do cabeçalho.
Stéphane Chazelas
fonte
1
as opções -r --column-names=0resolvido meu problema, tanques
FaxMax
3
Esse é o mesmo motivo pelo qual a lssaída é colocada em colunas quando a saída vai para um terminal, mas é uma única coluna ao gravar em um canal ou arquivo.
Barmar