Tại sao đường ống đến 'đuôi' thay đổi nội dung của một dòng?


14

Khi tôi xem kết quả của một SELECTvới Workbench MySQL, nó đúng với một \

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

Tôi có các tùy chọn này trong my.cnf:

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

Tại sao đường ống kết quả thông qua tailthay đổi đầu ra / chuỗi? (lưu ý gấp đôi \).


Bạn nhận được cùng một đầu ra nếu bạn chuyển qua một lệnh khác, phải không? Ví dụ mysql ... | headhay mysql ... | grep 8?
terdon

Cảm ơn vì đã cải thiện tiếng Anh của tôi. headgrep 802cũng tăng gấp đôi * \ * 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

bạn đang sử dụng cái đuôi nào bạn có thể chia sẻ đầu ra củatail --version
amisax

@amisax đuôi của tôi là tail (GNU coreutils) 8.23nhưng tôi có cùng một vấn đề với grep hoặc đầu
FaxMax

bash của tôi là GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)uname -akết quả:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Câu trả lời:


32

Không phải tail, đó là đường ống.

mysqlsử dụng một bảng với định dạng đầu ra đấm bốc ASCII khi thiết bị xuất chuẩn của nó là thiết bị đầu cuối, khi nó dành cho người dùng và trở lại định dạng tập lệnh khi không, như khi nó là một ống hoặc một tệp thông thường.

Bạn sẽ thấy cùng một định dạng khác nhau với

mysql... | cat

hoặc là

mysql > file; cat file

Xem thêm -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table... ảnh hưởng đến định dạng đầu ra.

Nếu bạn muốn đầu ra dạng bảng ngay cả khi đầu ra không đi đến thiết bị đầu cuối, hãy thêm -ttùy chọn:

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

Nhưng nếu vấn đề là loại bỏ dòng tiêu đề, chỉ cần sử dụng -N, có hoặc không có -t.

Ở đây để có được các giá trị từ cơ sở dữ liệu càng thô càng tốt và không có tiêu đề, tôi sẽ sử dụng:

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

Đó là:

  • không để lộ mật khẩu ở đầu ra psbằng cách chuyển thông tin đăng nhập trong một tệp thay vào đó (như bạn my.cnf) với --defaults-extra-file.
  • sử dụng chế độ hàng loạt để tránh đầu ra dạng bảng (và thừa nhận thực tế là chúng ta thực sự đang trộn nó có thể có ý nghĩa khác).
  • --rawđể tránh sự trốn thoát . Giả sử các giá trị không chứa dòng mới vì nếu không thì đầu ra không thể được xử lý sau một cách đáng tin cậy.
  • --skip-column-names để loại bỏ dòng tiêu đề.

1
các tùy chọn đã -r --column-names=0giải quyết vấn đề của tôi, xe tăng
FaxMax

3
Đây là cùng một lý do mà lsđầu ra được đưa vào các cột khi đầu ra đi đến một thiết bị đầu cuối, nhưng là một cột duy nhất khi ghi vào một đường ống hoặc tệp.
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.