為什麼將“mysql”管道連接到“tail”會改變輸出格式?

為什麼將“mysql”管道連接到“tail”會改變輸出格式?

當我使用 MySQL Workbench 查看結果時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改變輸出/字串? (注意雙\)。

答案1

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

相關內容