Giữ màu sau khi đường ống grep đến grep


140

Có một câu hỏi tương tự trong Bảo tồn màu ls sau khi grep nhưng nó làm tôi khó chịu rằng nếu bạn chuyển đầu ra grep màu sang một grep khác mà màu không được bảo toàn.

Như một ví dụ grep --color WORD * | grep -v AVOIDkhông giữ màu của đầu ra đầu tiên. Nhưng đối với tôi ls | grep FILEgiữ màu sắc, tại sao sự khác biệt?


2
Câu hỏi này dường như lạc đề vì nó liên quan đến việc sử dụng lệnh Unix, thuộc về unix.stackexchange.com
Raptor

Câu trả lời:


162

grepđôi khi vô hiệu hóa đầu ra màu, ví dụ như khi ghi vào đường ống. Bạn có thể ghi đè hành vi này vớigrep --color=always

Dòng lệnh chính xác sẽ là

grep --color=always WORD * | grep -v AVOID

Điều này khá dài dòng, ngoài ra, bạn có thể chỉ cần thêm dòng

alias cgrep="grep --color=always"

.bashrcví dụ của bạn và sử dụng cgrepnhư grep màu. Khi xác định lại, grepbạn có thể gặp rắc rối với các tập lệnh dựa trên đầu ra cụ thể grepvà không thích mã thoát ascii.


4
Giải pháp này chỉ hoạt động trong những trường hợp may mắn nhất định. Xem câu trả lời của andersonvom dưới đây.
sinh

Trong trường hợp của tôi (Ubuntu) tôi đã có bí danh grep. alias grep='grep --color=autovì vậy tôi cần thay đổi vị trí của ~/.bashrcnó ở nơi đầu tiên.
sobi3ch

Không hoạt động với tôi - tương tự như kịch bản này stackoverflow.com/a/7640077/248616
Nam G VU

Ý tưởng sáng tạo tuyệt vời này chỉ đơn giản và hoạt động stackoverflow.com/a/36288791/248616
Nam G VU

câu hỏi là làm thế nào để làm cho grep thứ hai không thay thế màu của cái thứ nhất. Đây không phải là một câu trả lời cho điều đó.
johannes_lalala

74

Một lời khuyên:

Khi sử dụng grep --color=always, các chuỗi thực tế được chuyển sang ống tiếp theo sẽ được thay đổi. Điều này có thể dẫn đến tình huống sau:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Mặc dù tùy chọn -ve '12'nên loại trừ đường giữa, nhưng nó sẽ không vì có các ký tự màu nằm giữa 12.


Nếu bạn sử dụng --color=auto, thì nó sẽ nhận ra thực tế là bạn đang đặt nó ở một nơi khác và triệt tiêu màu sắc hoàn toàn, nhưng nó đánh bại mục đích. Nếu bạn vẫn muốn kết quả được tô màu, tôi đoán bạn có thể grep nó một lần nữa ở đường ống cuối cùng bằng cách sử dụng --color.
andersonvom

2
Trên Mac OS X, ít nhất, tô màu ở đường ống cuối cùng như @andersonvom cho thấy không hoạt động. Không chắc chắn lý do tại sao; Có lẽ đó là màu mô hình loại trừ? --color=alwayskhông hoạt động, với, tôi giả sử, hãy cẩn thận nêu trên.
dùng766353

3
Bạn phải có cùng một mẫu grep hai lần trong biểu thức của bạn. Tôi vừa thử nghiệm điều này trên máy mac: http://i.imgur.com/BhmwAlF.png
andersonvom

9

Đơn giản chỉ cần lặp lại lệnh grep tương tự ở cuối đường ống của bạn.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
Sẽ không đảo ngược các lệnh cung cấp kết quả tương tự? grep -v AVOID * | grep WORD
Brydon Gibson

@BrydonGibson có thể, nhưng đó là một ví dụ cho thấy rằng nó hoạt động với bất kỳ số lượng lệnh nào
Alex
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.