Pipe

為什麼管道mysql到’tail’會改變輸出格式?

  • July 22, 2020

當我使用 MySQL Workbench 查看 a 的結果時,一個****SELECT是正確的

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更改輸出/字元串來傳遞結果?(注意雙\)。

不是tail,是管道。

mysql當它的標準輸出是終端設備時使用帶有 ASCII 裝箱輸出格式的表格,當它是為使用者準備的時,當它不是時,它會恢復為腳本格式,例如當它是管道或正常文件時。

你會看到相同的不同格式

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刪除標題行。

引用自:https://unix.stackexchange.com/questions/406514