grep: làm thế nào để tô màu 2 từ khóa?


12

Tôi biết cách grep 2 từ khóa bằng cách sử dụng 1 lệnh, nhưng tôi chỉ có thể quản lý để tô màu một trong số chúng trong đầu ra. Đây là lệnh của tôi:

grep 'keyword1' file.log | grep 'keyword2'

Chỉ keyword2được tô sáng. Làm thế nào tôi có thể làm keyword1nổi bật cùng một lúc?

Câu trả lời:


15

Các greplệnh chấp nhận một --color=alwaystùy chọn, vì vậy bạn có thể sử dụng

grep 'keyword1' file.log --color=always | grep 'keyword2'

Như gertvdijk chỉ ra , lệnh này có thể không hiệu quả, nhưng nó sẽ tìm tất cả các dòng có chứa cả keyword1 và keyword2. Nếu bạn muốn làm nổi bật chúng bằng các màu khác nhau, bạn có thể sử dụng

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

Nó sẽ làm nổi bật keyword2 màu xanh lam. Phần này mtcó nghĩa là grepsẽ làm nổi bật văn bản phù hợp bằng cách sử dụng mã CSI này và 01;34có nghĩa là "tiền cảnh màu xanh đậm trên nền bình thường".


1
+1 để giải thích chi tiết và tùy chọn tùy chỉnh cho trường hợp sử dụng!
gertvdijk

Thật buồn cười, khi tôi thử điều này với: grep -R --color = always keyword1. | grep keyword2 // chỉ từ khóa đầu tiên được higlighted. Làm thế nào tôi có thể điều chỉnh câu trả lời của bạn để làm việc với tìm kiếm đệ quy?
TenLeftFingers

1
Đó là kỳ lạ, grep -R --color=always keyword1 . | grep keyword2nên làm việc. Bạn có đang chuyển hướng đầu ra một lần nữa (chẳng hạn như bằng cách chuyển thứ hai grepvào less -R)? Nếu vậy, bạn cũng cần thêm --color=alwaysvào cái thứ hai.
Daniel H

Câu trả lời chính xác! Để làm nổi bật cả hai, --color=autosẽ cần một thứ hai grep, ngay sau đó 'keyword2'.
Luis

@Luis Vâng, bạn đúng là Grep ít nhất thường mặc định không có màu (mặc dù đó có thể là tùy chọn cấu hình thời gian? Tôi không nghĩ rằng tôi đã bị ghi đè vào năm 2013 khi nó hoạt động trên máy của tôi mà không có điều đó). Tôi đã thêm vào --color=alwayscâu trả lời, bởi vì bạn có thể muốn đưa nó đến lesshoặc một cái gì đó cũng có.
Daniel H

3

Hãy thử các biểu thức chính quy thực tế, thay vì chuyển sang một thể hiện khác của grep, ví dụ:

grep -E "\<foo\>.*\<bar\>" file

Thật không may, điều này chỉ giới hạn ở các dòng khớp mà từ khóa này chỉ khớp với thứ tự này. Dù sao, việc sử dụng greptrong câu hỏi của bạn là không hiệu quả và bạn nên tránh nó. Câu trả lời của @DanielH có lẽ khá đơn giản hơn cho trường hợp của bạn, có lẽ.

Để phù hợp với từ khóa 'hoặc', tôi sử dụng từ này thường xuyên:

grep -E "(foo|bar)" file

1
Tôi nghĩ rằng OP chỉ muốn các dòng có chứa cả hai từ khóa (lệnh bạn đã đưa ra cho tất cả các dòng có chứa một từ khóa).
Daniel H

@DanielH Cảm ơn bạn đã chỉ ra điều đó. Tôi đã cập nhật câu trả lời của mình.
gertvdijk

Không phải nó vẫn chỉ hoạt động nếu foo đến trước thanh? Tôi không biết liệu có cách nào tốt hơn foo.*bar|bar.*foo, hoặc nếu điều đó thậm chí là cần thiết cho trường hợp này (dường như là một tệp nhật ký có thể có thứ tự chuẩn cho các từ khóa). Tôi đã thêm câu trả lời của mình trước khi bạn cập nhật câu trả lời của mình, nhưng tôi sẽ giữ nó trong trường hợp có trường hợp grepthực sự cần thiết (hoặc bất kỳ đầu ra màu nào khác không nên được gửi đến thiết bị đầu cuối, như grep | less -R).
Daniel H
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.