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 đó \e
chỉ đị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 -o
tù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[0m
hoặc \e[30m
trê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'
>&1
? Ý tôi là, những thứ màu đỏ sẽ không biến mất nếu bạn2>/dev/null
, phải không?