Mengapa perpipaan ke 'tail' mengubah isi garis?

14

Ketika saya melihat hasil SELECTdengan MySQL Workbench, itu benar dengan satu tunggal \

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

Saya memiliki opsi ini di my.cnf:

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

Mengapa piping hasilnya melalui tailperubahan output / string? (perhatikan ganda \).

FaxMax
sumber
Anda mendapatkan output yang sama jika Anda menyalurkan melalui perintah lain, kan? Misalnya mysql ... | headatau mysql ... | grep 8?
terdon
Terima kasih telah meningkatkan bahasa Inggris saya. headdan grep 802jangan juga menggandakan * \ * 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
ekor mana yang kamu gunakan? dapatkah Anda berbagi output daritail --version
amisax
@amisax ekor saya tail (GNU coreutils) 8.23tetapi saya memiliki masalah yang sama dengan grep atau kepala
FaxMax
pesta saya GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)dan uname -ahasilnya:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Jawaban:

32

Bukan tail, ini perpipaannya.

mysqlmenggunakan tabular dengan format output tinju ASCII ketika stdout adalah perangkat terminal, ketika itu ditujukan untuk pengguna, dan kembali ke format skrip ketika itu tidak, seperti ketika itu pipa atau file biasa.

Anda akan melihat format berbeda yang sama dengan

mysql... | cat

atau

mysql > file; cat file

Lihat juga -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table... yang memengaruhi format output.

Jika Anda ingin output tabular bahkan ketika output tidak pergi ke perangkat terminal, tambahkan -topsi:

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

Tetapi jika intinya adalah untuk menghapus baris header, cukup gunakan -N, dengan atau tanpa -t.

Di sini untuk mendapatkan nilai-nilai dari basis data se-mentah mungkin dan tanpa header, saya akan menggunakan:

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

Itu adalah:

  • tidak mengekspos kata sandi dalam output psdengan meneruskan kredensial dalam file sebagai gantinya (seperti Anda my.cnf) dengan --defaults-extra-file.
  • gunakan mode batch untuk menghindari output tabular (dan akui fakta bahwa kita sebenarnya mengelompokkannya yang mungkin memiliki implikasi lain).
  • --rawuntuk menghindari melarikan diri . Dengan asumsi nilai tidak mengandung baris baru karena jika tidak, output tidak dapat diproses secara andal.
  • --skip-column-names untuk menghapus baris header.
Stéphane Chazelas
sumber
1
opsi -r --column-names=0memecahkan masalah saya, tank
FaxMax
3
Ini adalah alasan yang sama bahwa lsoutput dimasukkan ke dalam kolom ketika output masuk ke terminal, tetapi merupakan satu kolom saat menulis ke pipa atau file.
Barmar