Warum ändert die Weiterleitung von „mysql“ an „tail“ das Ausgabeformat?

Warum ändert die Weiterleitung von „mysql“ an „tail“ das Ausgabeformat?

Wenn ich mir das Ergebnis SELECTmit MySQL Workbench ansehe, ist es korrekt mit einer 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 tailändert sich die Ausgabe/Zeichenfolge, wenn das Ergebnis weitergereicht wird? (Beachten Sie das „double \“).

Antwort1

Das ist es nicht tail, es liegt an der Verrohrung.

mysqlverwendet ein tabellarisches Ausgabeformat mit ASCII-Boxing, wenn sein Standardausgang ein Terminalgerät ist, wenn es für einen Benutzer bestimmt ist, und kehrt zu einemSkripterstellungFormat, wenn dies nicht der Fall ist, beispielsweise wenn es sich um eine Pipe oder eine normale Datei handelt.

Sie würden dasselbe sehenandersFormat mit

mysql... | cat

oder

mysql > file; cat file

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

Wenn Sie die tabellarische Ausgabe auch dann wünschen, wenn die Ausgabe nicht an ein Terminalgerät geht, fügen Sie die -tOption hinzu:

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

Wenn es jedoch darum geht, die Kopfzeile zu entfernen, verwenden Sie einfach -N, mit oder ohne -t.

Um die Werte aus der Datenbank möglichst roh und ohne Header zu erhalten, würde ich hier Folgendes verwenden:

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

Das ist:

  • Geben Sie das Kennwort nicht in der Ausgabe von preis, psindem Sie die Anmeldeinformationen stattdessen in einer Datei (wie Ihrer my.cnf) mit übergeben --defaults-extra-file.
  • verwenden Sie dieChargeModus, um die tabellarische Ausgabe zu vermeiden (und berücksichtigen Sie die Tatsache, dass wir sie tatsächlich stapelweise verarbeiten, was andere Auswirkungen haben kann).
  • --rawzur Vermeidung derFlucht. Vorausgesetzt, die Werte enthalten keine Zeilenumbrüche, da die Ausgabe sonst nicht zuverlässig nachbearbeitet werden könnte.
  • --skip-column-namesum die Kopfzeile zu entfernen.

verwandte Informationen