ทำไมการเปลี่ยนเป็น 'หาง' จึงเปลี่ยนเนื้อหาของบรรทัด


14

เมื่อฉันดูผลลัพธ์ของ a SELECTด้วย MySQL Workbench มันถูกต้องด้วยหนึ่งเดียว\

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การเปลี่ยนเอาท์พุต / สตริง (หมายเหตุคู่\)


คุณได้รับผลลัพธ์เดียวกันถ้าคุณไพพ์ผ่านคำสั่งอื่นใช่ไหม ตัวอย่างmysql ... | headหรือmysql ... | grep 8?
terdon

ขอบคุณสำหรับการพัฒนาภาษาอังกฤษของฉัน headและgrep 802ทำสองเท่าของ* \ * 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

คุณใช้หางไหน คุณสามารถแบ่งปันผลลัพธ์ของtail --version
amisax

@amisax หางของฉันคือtail (GNU coreutils) 8.23แต่ฉันมีปัญหาเดียวกันกับ grep หรือหัว
FaxMax

ทุบตีของฉันคือGNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)และuname -aผลลัพธ์:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

คำตอบ:


32

ไม่ใช่tailมันเป็นเรื่องของท่อ

mysqlใช้ตารางที่มีรูปแบบเอาต์พุต ASCII Boxing เมื่อ stdout เป็นอุปกรณ์เทอร์มินัลเมื่อมันมีไว้สำหรับผู้ใช้และเปลี่ยนกลับไปเป็นรูปแบบสคริปต์เมื่อไม่เช่นเมื่อเป็นไพพ์หรือไฟล์ปกติ

คุณจะเห็นรูปแบบที่แตกต่างกันด้วย

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 เพื่อลบบรรทัดส่วนหัว

1
ตัวเลือก-r --column-names=0แก้ไขปัญหารถถังของฉัน
FaxMax

3
นี่คือเหตุผลเดียวกับที่lsเอาต์พุตถูกใส่ลงในคอลัมน์เมื่อเอาต์พุตไปยังเทอร์มินัล แต่เป็นคอลัมน์เดียวเมื่อเขียนไปยังไพพ์หรือไฟล์
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.