Đánh dấu sự xuất hiện của từ khóa với một màu khác


13

Tôi có một chương trình tạo ra một đầu ra stdoutnhư sau:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Để dễ dàng phát hiện ra sự thất bại từ đầu ra, tôi muốn đánh dấu các lần xuất hiện của từ khóa FAILbằng màu đỏ mà không loại bỏ các thông báo khác. Sẽ thật tuyệt nếu tôi cũng có thể làm nổi bật các OKtừ khóa với màu xanh lá cây :).

Làm một đường ống egrep --color FAILsẽ chỉ hiển thị các dòng có FAILtừ khóa.


1
Để biết grepgiải pháp, hãy xem unix.stackexchange.com/a 432322
manatwork

Bạn có quyền truy cập để thay đổi mã nguồn? nó có phải là một kịch bản bash không?
h3rrmiller

@manatwork Từ liên kết bạn đã chỉ định, tôi đã nhấp vào stackoverflow.com/questions/972370 và với một số tail -fawkphép thuật, tôi rất tốt để đi =)
Theodor

Câu trả lời:


10

Dựa trên bản manatworkhack "hoặc không có gì" tuyệt vời trong câu hỏi khác, tôi đưa ra điều này, bổ sung khả năng để có được hai màu nổi bật:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Đó là, bạn chạy grepqua đầu ra hai lần, với một GREP_COLORSbiến môi trường khác nhau mỗi lần.

Giá trị '01; 32 'có nghĩa là "đậm màu xanh lá cây" và giá trị khác có nghĩa là "đậm màu đỏ". Xem bài viết Wikipedia về mã ANSI để biết thêm ý tưởng.

Than ôi, điều này đòi hỏi GNU grep phiên bản 2.5.3 trở lên. Các phiên bản cũ hơn của GNU grep đã hỗ trợ một cơ chế tô màu khác, nhưng các phiên bản đó có một lỗi khiến bạn không thể sử dụng tính năng này trong một đường ống nhiều lần. BSD grep mô phỏng cơ chế tô màu GNU grep cũ hơn và nó sẽ hoạt động hai lần trong một đường ống, nhưng nó hét lên về "biểu thức phụ trống" do manatworkhack.

Bạn có thể xóa dấu gạch chéo ngược ở cuối hai dòng đầu tiên để biến tất cả thành một dòng duy nhất. Tôi chỉ cần chia nó ở đây cho rõ ràng và để chơi tốt với định dạng trang SE.


Đó thực sự là tuyệt vời! Nhưng vì một số lý do, tập lệnh dường như không làm nổi bật câu lệnh thứ hai trên máy của tôi. Tôi đang chạy CentOS 5.
Theodor

2
Điều đang xảy ra ở đây là CentOS 5 cung cấp một GNU grep đủ cũ mà nó không hỗ trợ GREP_COLORS, số nhiều. Nó chỉ sử dụng GREP_COLORphương thức cũ hơn và phương thức đó có một lỗi trong đó ngăn nó thực hiện đúng. Nếu bạn thay đổi lệnh để sử dụng GREP_COLOR=32và như vậy, nó sẽ chỉ thay đổi màu tô sáng của trận đấu đầu tiên. Nếu bạn dẫn kết quả qua hexdump -cbạn có thể thấy rằng việc thêm egreplệnh thứ hai sẽ làm được điều gì đó, nhưng đó không phải là ANSI hợp pháp. Điểm mấu chốt: bạn phải nâng cấp grepđể làm việc này ngay.
Warren Young

Haha đó là một nhận xét sâu sắc. Vâng, CentOS5 đang trở nên cũ kỹ, cũng như nhiều hệ điều hành đang chạy trên máy cũ đã loại bỏ các thông điệp nhật ký cũ, thần đã từ bỏ :) Tôi sẽ thử xem có thể nâng cấp lên centos6 không.
Theodor

Tôi vừa mới kiểm tra giải pháp của tôi trên một CentOS 6 hộp, và nó làm việc ở đó, xác nhận chẩn đoán của tôi. (Các thử nghiệm trước đó đã có trên các máy chủ Ubuntu.) Các tàu EL6 với GNU grep 2.6.3. Thật thú vị, họ cũng đã sửa lỗi GREP_COLOR(số ít), mặc dù tính năng này không được chấp nhận ngay khi được thay thế.
Warren Young

Tôi không thể hiểu làm thế nào điều này giải quyết vấn đề vì grep thứ nhất sẽ lọc tất cả "FAIL" vì vậy sẽ không còn gì để grep thứ hai khớp với ..
laertis

1

Bạn có thể sử dụng đa nhiệm hoặc ccze cho việc này, cả hai đều cho phép cấu hình để mô tả regexps cho phù hợp và màu sắc.


1

Dựa trên câu trả lời của Warren Young, tôi đã viết kịch bản Python này thực hiện điều tương tự thanh lịch hơn và ít gõ hơn. Vì vậy, đây là cách bạn sử dụng tập lệnh đó:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
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.