Pergantian warna dilakukan melalui urutan escape yang tertanam dalam teks. Biasanya, program mengeluarkan urutan pelarian ANSI , karena itulah yang sebenarnya didukung semua terminal saat ini.
Urutan melarikan diri untuk mengalihkan warna latar depan menjadi merah adalah \e[31m
, di mana \e
menunjuk karakter pelarian (oktal 033, 1b heksadesimal, juga dikenal sebagai ESC, ^[
dan berbagai sebutan lainnya). Angka dalam kisaran 30–39 mengatur warna latar depan; nomor lain mengatur atribut yang berbeda. \e[0m
mengatur ulang semua atribut ke nilai standarnya. Jalankan cat -v
untuk memeriksa apa yang dicetak oleh program, mungkin menggunakan beberapa varian seperti \e[0;31m
untuk mengatur ulang semua atribut terlebih dahulu, atau \e[3;31
juga untuk mengaktifkan huruf miring (yang tidak didukung banyak terminal).
Di ksh, bash, atau zsh, Anda dapat menggunakan $'…'
untuk mengaktifkan $'\e'
escape backslash di dalam tanda kutip, yang memungkinkan Anda mengetik untuk mendapatkan karakter pelarian. Perhatikan bahwa Anda harus menggandakan backslash yang ingin Anda sampaikan grep
. Di /bin/sh
, Anda bisa menggunakan "$(printf \\e)"
atau mengetikkan karakter pelarian literal.
Dengan grep -o
opsi GNU , cuplikan berikut memfilter teks merah, dengan asumsi bahwa itu dimulai dengan urutan escape \e[31m
, diakhiri dengan salah satu \e[0m
atau \e[30m
pada baris yang sama, dan tidak mengandung urutan escape yang tertanam.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
awk
Cuplikan berikut mengekstrak teks merah, meskipun multiline.
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'
Berikut adalah variasi yang mempertahankan perintah pengubah warna, yang bisa berguna jika Anda memfilter banyak warna (di sini merah dan magenta).
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
? Maksudku, benda merah tidak hilang jika kau2>/dev/null
, kan?