Warum ändert die Pipe-Funktion "Tail" den Inhalt einer Zeile?

14

Wenn ich das Ergebnis von SELECTmit MySQL Workbench ansehe, ist es mit einem einzigen \

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

Ich habe diese Optionen in my.cnf:

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

Warum ändert die Weiterleitung des Ergebnisses durch taildie Ausgabe / Zeichenfolge? (Beachte das Doppel \).

FaxMax
quelle
Sie erhalten dieselbe Ausgabe, wenn Sie einen anderen Befehl weiterleiten, oder? Zum Beispiel mysql ... | headoder mysql ... | grep 8?
Terdon
Vielen Dank für die Verbesserung meines Englisch. headund grep 802verdoppeln Sie auch * \ * 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.17
Welchen Schwanz benutzt du? können Sie die Ausgabe vontail --version
amisax
@ Amisax mein Schwanz ist, tail (GNU coreutils) 8.23aber ich habe das gleiche Problem mit
Grep
Mein Bash ist GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)und uname -aErgebnisse:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Antworten:

32

Es ist nicht taildie Rohrleitung.

mysqlVerwendet ein tabellarisches Ausgabeformat mit ASCII-Boxing, wenn es sich bei stdout um ein Endgerät handelt, wenn es für einen Benutzer bestimmt ist, und kehrt zu einem Skriptformat zurück , wenn dies nicht der Fall ist , beispielsweise wenn es sich um eine Pipe oder eine reguläre Datei handelt.

Sie würden das gleiche unterschiedliche Format mit sehen

mysql... | cat

oder

mysql > file; cat file

Siehe auch -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table..., die sich auf das Ausgabeformat auswirken.

Wenn Sie die tabellarische Ausgabe auch dann wünschen, wenn die Ausgabe nicht an ein Endgerät gesendet wird, fügen Sie die folgende -tOption hinzu:

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

Wenn Sie jedoch die Kopfzeile entfernen möchten, verwenden Sie einfach -N, mit oder ohne -t.

Um die Werte so roh wie möglich und ohne Header aus der Datenbank abzurufen, würde ich Folgendes verwenden:

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

Das ist:

  • Legen Sie das Kennwort bei der Ausgabe von nicht offen, psindem Sie die Anmeldeinformationen stattdessen in einer Datei (wie Sie my.cnf) mit übergeben --defaults-extra-file.
  • Verwenden Sie den Batch- Modus, um die tabellarische Ausgabe zu vermeiden (und bestätigen Sie die Tatsache, dass wir sie tatsächlich stapeln, was andere Auswirkungen haben kann).
  • --rawdie Flucht zu vermeiden . Vorausgesetzt, die Werte enthalten keine Zeilenumbrüche, da sonst die Ausgabe nicht zuverlässig nachbearbeitet werden kann.
  • --skip-column-names um die Kopfzeile zu entfernen.
Stéphane Chazelas
quelle
1
Die Optionen -r --column-names=0lösten mein Problem, Tanks
FaxMax
3
Dies ist der gleiche Grund, warum die lsAusgabe in Spalten abgelegt wird, wenn sie an ein Terminal gesendet wird, aber beim Schreiben in eine Pipe oder Datei eine einzelne Spalte ist.
Barmar