Bộ lọc đầu ra của lệnh theo màu


13

Tôi đang chạy một tiện ích không cung cấp cách lọc đầu ra của nó. Không có gì trong văn bản của đầu ra chỉ ra rằng một chức năng cụ thể không thành công nhưng nó hiển thị màu đỏ. Đầu ra quá dài đến mức khi báo cáo một số lỗi tôi luôn không thể cuộn để xem đầu ra xảy ra lỗi.

Làm thế nào tôi có thể lọc ra văn bản không phải màu đỏ?

mã giả:

dolongtask | grep -color red

Biên tập

Lệnh kết quả đầu ra màu sắc khác nữa và tôi cần để có thể lọc ra tất cả các văn bản mà không được đỏ. Ngoài ra màu văn bản là multiline.


1
Tôi xin lỗi vì đã hỏi điều hiển nhiên - nhưng tất cả đầu ra là vào >&1? Ý tôi là, những thứ màu đỏ sẽ không biến mất nếu bạn 2>/dev/null, phải không?
mikeerv

Câu trả lời:


15

Chuyển đổi màu sắc được thực hiện thông qua các chuỗi thoát được nhúng trong văn bản. Lúc nào cũng vậy, các chương trình đưa ra các chuỗi thoát ANSI , bởi vì đó là điều mà hầu như tất cả các thiết bị đầu cuối hiện nay đều hỗ trợ.

Trình tự thoát để chuyển màu nền trước thành màu đỏ \e[31m, trong đó \echỉ định một ký tự thoát (bát phân 033, thập lục phân 1b, còn được gọi là ESC ^[và các chỉ định khác). Các số trong phạm vi 30 Ném39 đặt màu nền trước; các số khác đặt các thuộc tính khác nhau. \e[0mĐặt lại tất cả các thuộc tính về giá trị mặc định của chúng. Chạy cat -vđể kiểm tra những gì chương trình in, nó có thể sử dụng một số biến thể, chẳng hạn như \e[0;31mđể thiết lập lại tất cả các thuộc tính hoặc \e[3;31để bật chữ nghiêng (mà nhiều thiết bị đầu cuối không hỗ trợ).

Trong ksh, bash hoặc zsh, bạn có thể sử dụng $'…'để bật dấu gạch chéo ngược bên trong dấu ngoặc kép, cho phép bạn nhập $'\e'để nhận ký tự thoát. Lưu ý rằng sau đó bạn sẽ phải tăng gấp đôi bất kỳ dấu gạch chéo ngược nào mà bạn muốn chuyển đến grep. Trong /bin/sh, bạn có thể sử dụng "$(printf \\e)"hoặc gõ một ký tự thoát theo nghĩa đen.

Với grep -otùy chọn GNU , đoạn mã sau lọc văn bản màu đỏ, giả sử rằng nó bắt đầu bằng chuỗi thoát \e[31m, kết thúc bằng một \e[0mhoặc \e[30mtrên cùng một dòng và không chứa chuỗi thoát được nhúng.

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

awkĐoạn mã sau trích xuất văn bản màu đỏ, ngay cả khi nó là đa dòng.

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        red = (color ~ /1;*$/)
    }
    red'

Đây là một biến thể giữ lại các lệnh thay đổi màu, có thể hữu ích nếu bạn lọc nhiều màu (ở đây là đỏ và đỏ tươi).

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        printf "\033%s", substr($0, 1, RLENGTH);
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        desired = (color ~ /[15];*$/)
    }
    desired'

Các giải pháp awk làm việc cho tôi. Bất kỳ cách nào để giữ lại màu sắc trong đầu ra?
km6zla

@ ogc-nick Bạn muốn đầu ra toàn màu đỏ? printf '\e[31m'; awk …; printf '\e[0m'
Gilles 'SO- đừng trở nên xấu xa'

Chỉ với bất kỳ màu nào tôi đang lọc để được giữ lại ở đầu ra.
km6zla

@ ogc-nick Xem chỉnh sửa của tôi.
Gilles 'SO- đừng trở nên xấu xa'

6

Bạn có thể có grep tìm kiếm các ký tự điều khiển, một số trong đó chịu trách nhiệm tạo ra các màu sắc đẹp trên thiết bị đầu cuối.

dolongtask | grep '[[:cntrl:]]'

Ví dụ, điều này lặp lại một "thử nghiệm" màu đỏ thành grep, tìm thấy nó do nó được bao quanh bởi các ký tự điều khiển:

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

Điều --color=nonenày chỉ để đảm bảo grep không áp dụng màu sắc riêng của nó cho đầu ra phù hợp, nhưng in toàn bộ dòng một cách trung thực để các ký tự điều khiển sẽ được giải thích bởi trình bao.


Đẹp. Tôi tự hỏi nếu một người có thể đi xa hơn và làm một cái gì đó như grep -E $'\033\[0?[01];31m.+?\033\[0?0m'hoặc grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'để kiểm tra màu đỏ cụ thể?
Steel

Tôi bắt đầu nghĩ ra các biểu thức chính như những gì bạn đề xuất, nhưng trước khi tôi có thể làm cho chúng hoạt động, tôi đã vấp ngã [[:cntrl:]]. Tôi đã thử nghiệm của bạn và họ làm việc cho tôi, tức là. phù hợp với màu đỏ và không phù hợp với màu sắc khác.
savanto

Hoạt động tuyệt vời nhưng sẽ phù hợp với bất kỳ màu sắc. Tôi đã không đề cập đến nó trong câu hỏi nhưng nhiều màu khác cũng là đầu ra và tôi chỉ muốn xem những thứ màu đỏ. +1 cho mã đơn giản và làm việc.
km6zla
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.