Dlaczego orurowanie prowadzące do „ogona” zmienia zawartość linii?


14

Kiedy przeglądam wynik SELECTz MySQL Workbench, jest poprawny z jednym pojedynczym \

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

Mam te opcje w my.cnf:

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

Dlaczego potokowanie wyniku poprzez tailzmianę wyniku / ciągu? (zwróć uwagę na podwójne \).


Otrzymasz ten sam wynik, jeśli przejdziesz przez inne polecenie, prawda? Na przykład mysql ... | headczy mysql ... | grep 8?
terdon

Dzięki za poprawę mojego angielskiego. heada grep 802także dwukrotnie * * * 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

jakiego ogona używasz? czy możesz podzielić się wynikamitail --version
amisax z

@amisax mój ogon jest, tail (GNU coreutils) 8.23ale mam ten sam problem z
grepem

moja bash jest GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)i uname -awyniki:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Odpowiedzi:


32

To nie jest tail, to orurowanie.

mysqlużywa tabelarycznego formatu wyjściowego boksu ASCII, gdy jego standardowe wyjście jest urządzeniem końcowym, gdy jest przeznaczone dla użytkownika, i wraca do formatu skryptowego , gdy nie jest, na przykład gdy jest to potok lub zwykły plik.

Zobaczysz ten sam inny format z

mysql... | cat

lub

mysql > file; cat file

Zobacz także -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table..., które wpływają na format wyjściowy.

Jeśli chcesz, aby wynik tabelaryczny był wyświetlany nawet wtedy, gdy dane wyjściowe nie trafią do urządzenia końcowego, dodaj -topcję:

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

Ale jeśli chodzi o usunięcie linii nagłówka, po prostu użyj -N, z lub bez -t.

Tutaj, aby uzyskać wartości z bazy danych tak surowe, jak to możliwe i bez nagłówka, użyłbym:

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

To jest:

  • nie ujawniaj hasła na wyjściu ps, przekazując poświadczenia w pliku zamiast (jak ty my.cnf) za pomocą --defaults-extra-file.
  • użyj trybu wsadowego , aby uniknąć wyniku tabelarycznego (i potwierdź fakt, że tak naprawdę dzielimy go na partie , co może mieć inne konsekwencje).
  • --rawaby uniknąć ucieczki . Zakładając, że wartości nie zawierają znaków nowej linii, ponieważ w przeciwnym razie dane wyjściowe nie mogłyby zostać przetworzone w sposób niezawodny.
  • --skip-column-names aby usunąć linię nagłówka.

1
opcje -r --column-names=0rozwiązały mój problem, czołgi
FaxMax

3
Jest to ten sam powód, dla którego lsdane wyjściowe są umieszczane w kolumnach, gdy dane wyjściowe trafiają do terminala, ale jest to jedna kolumna podczas zapisywania do potoku lub pliku.
Barmar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.