Когда я просматриваю результат 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
чтобы удалить строку заголовка.