Câu trả lời:
Các grep
lệnh chấp nhận một --color=always
tù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 mt
có nghĩa là grep
sẽ 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;34
có nghĩa là "tiền cảnh màu xanh đậm trên nền bình thường".
grep -R --color=always keyword1 . | grep keyword2
nê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 grep
vào less -R
)? Nếu vậy, bạn cũng cần thêm --color=always
vào cái thứ hai.
--color=auto
sẽ cần một thứ hai grep
, ngay sau đó 'keyword2'
.
--color=always
câu trả lời, bởi vì bạn có thể muốn đưa nó đến less
hoặc một cái gì đó cũng có.
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 grep
trong 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
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 grep
thự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
).