Почему при передаче `mysql` в `tail' изменяется формат вывода?

Почему при передаче `mysql` в `tail' изменяется формат вывода?

Когда я просматриваю результат SELECTс помощью MySQL Workbench, он правильный с одним единственным\

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

У меня есть следующие варианты my.cnf:

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

Почему передача результата по конвейеру tailизменяет вывод/строку? (обратите внимание на двойной символ \).

решение1

Это не так tail, это трубы.

mysqlиспользует табличный формат с ASCII-боксингом, когда его stdout является терминальным устройством, когда он предназначен для пользователя, и возвращается кнаписание сценариевформатировать, когда это не так, например, когда это канал или обычный файл.

Вы бы увидели то же самое.другойформат с

mysql... | cat

или

mysql > file; cat file

См. также -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0​​, -H/ --html, -t/ --table..., которые влияют на формат вывода.

Если вам нужен табличный вывод даже в том случае, если вывод не отправляется на терминальное устройство, добавьте опцию -t:

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

Но если нужно удалить строку заголовка, просто используйте -N, с -t.

Чтобы получить значения из базы данных как можно более сырыми и без заголовков, я бы использовал:

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

То есть:

  • не раскрывайте пароль в выходных данных, psпередавая учетные данные в файле (как ваш my.cnf) с помощью --defaults-extra-file.
  • использоватьпартиярежим, чтобы избежать табличного вывода (и признать тот факт, что мы фактически пакетируем его, что может иметь другие последствия).
  • --rawчтобы избежатьпобег. Предполагаем, что значения не содержат символов новой строки, иначе вывод не может быть надежно обработан.
  • --skip-column-namesчтобы удалить строку заголовка.

Связанный контент