當我使用 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
刪除標題行。