Làm cách nào để giữ mã màu với đầu vào grep?


15

Nếu tôi sử dụng hai greplệnh liên tiếp , ví dụ:

echo "foo bar" | grep foo | grep bar

Sau đó, mẫu đầu tiên ("foo") không được tô sáng. Trong thực tế, có vẻ như grep loại bỏ mã màu khỏi đầu vào của nó. Có cách nào để ngăn chặn điều này?


Một câu hỏi khác có cùng câu trả lời: làm thế nào bạn có thể khôi phục đầu ra màu thành grep trong hàm bash?
Camille Goudeseune

Câu trả lời:


22

Sử dụng --color=always.

grepphát hiện nếu đầu ra là một đường ống (hoặc tập tin). Bạn hầu như không bao giờ muốn màu sắc khi đầu ra là tập tin - vì đó là chuỗi thoát cho thiết bị đầu cuối. Điển hình là:

foo ^[[01;31m^[[Kbar^[[m^[[K

từ ví dụ:

grep pattern file > result

Để ghi đè sử dụng --color=always.

grep --color=always pattern file | ...

Thí dụ:

Có tập tin:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

Sau đó

grep --color=always ID file | grep --color=always 2013 | grep foo

sẽ tô màu ID, 2013foo.

grep --color=always ID file | grep 2013 | grep foo

sẽ tô màu IDfoo, nhưng không phải 2013.

1 Quan trọng: Bạn cũng phải nhớ rằng sự lộn xộn được thêm vàotừ màu sắc được chuyển sang lệnh tiếp theo trong chuỗi. Khi ID được màu, bạn có thể không (một cách dễ dàng), phù hợp với ví dụID=111.


Trong một số trường hợp, người ta có thể muốn màu thiết bị đầu cuối trong tập tin . Hãy thử ví dụ

 grep --color=always foo file > result
 cat result

Mặc dù các tập tin kết quả sẽ có tính di động rất hạn chế.


Bản thân màu cũng là một phần mở rộng.


Như được đề cập bởi @slm tốt , bạn có thể thêm:

export GREP_OPTIONS="--color=always"

.bashrcvv của bạn , nhưng không trừ khi bạn vì một số lý do thực sự hiểu ý nghĩa và vẫn muốn làm điều đó. Nó sẽ bị phá vỡ theo nhiều cách grepdo thực tế đã đề cập ở trên 1 .

Thêm một aliasnếu bạn sử dụng nó thường xuyên.

 alias cgrep='grep --color=always'

GREP_OPTIONS--color mất ba tùy chọn : never, autoalways. Hai người đầu tiên nên là người duy nhất được xem xét cho GREP_OPTIONS.

Bạn cũng có thể kiểm tra GREP_COLORStrong các mantrang hoặc tại gnu grep .


Chi tiết bổ sung về phương pháp này ưu / nhược điểm tại đây: stackoverflow.com/questions/867877/ cấp
slm

1
thêm câu này vào câu trả lời: export GREP_OPTIONS="--color=always"trong một .bashrc làm cho các tùy chọn mặc định cho bất kỳ greps nào và bạn đã đóng đinh nó khá nhiều!
slm

Những thứ hay ho trong Q & A Super Uuser này: superuser.com/questions/36022/ cấp
slm

"grep phát hiện nếu đầu ra là một đường ống" - aha! Đây là chìa khóa, grep không tô màu nếu nó là một phần của đường ống. Cần có một nguyên tắc thay thế chống lại điều này: - /
Chris2048

@ Chris2048: Đây là tiêu chuẩn cho hầu hết các công cụ in màu đến thiết bị đầu cuối. Bạn có thể tìm thấy một số chi tiết hơn bằng cách này , về cách phát hiện nó, và điều này cho thấy một số vấn đề bằng cách ví dụ như ls và màu sắc trên OSut bản địa lsvà gnu coreutils.
Runium
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.