Saya menjalankan utilitas yang tidak menawarkan cara untuk memfilter outputnya. Tidak ada dalam teks output yang menunjukkan bahwa fungsi tertentu gagal tetapi tidak muncul dalam warna merah. Outputnya sangat panjang sehingga pada akhirnya ketika # melaporkan beberapa kesalahan saya tidak bisa selalu gulir untuk melihat output di mana kesalahan terjadi.
Bagaimana saya bisa memfilter teks non-merah?
kode semu:
dolongtask | grep -color red
Edit
Perintah output warna lain juga dan saya harus mampu menyaring keluar semua teks yang tidak merah. Juga pewarnaan teks adalah multiline.
>&1
? Maksudku, benda merah tidak hilang jika kau2>/dev/null
, kan?Jawaban:
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. Jalankancat -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 sampaikangrep
. 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.awk
Cuplikan berikut mengekstrak teks merah, meskipun multiline.Berikut adalah variasi yang mempertahankan perintah pengubah warna, yang bisa berguna jika Anda memfilter banyak warna (di sini merah dan magenta).
sumber
printf '\e[31m'; awk …; printf '\e[0m'
Anda dapat meminta grep mencari karakter kontrol, beberapa di antaranya bertanggung jawab untuk membuat warna-warna cantik di terminal.
Misalnya, ini menggemakan "tes" merah ke grep, yang menemukannya karena dikelilingi oleh karakter kontrol:
Ini
--color=none
hanya untuk memastikan grep tidak menerapkan pewarnaannya sendiri untuk output yang cocok, tetapi mencetak seluruh baris dengan setia sehingga karakter kontrol akan ditafsirkan oleh shell.sumber
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
ataugrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
menguji untuk warna merah secara khusus?[[:cntrl:]]
. Saya menguji Anda dan mereka bekerja untuk saya, yaitu. cocok merah dan gagal untuk mencocokkan warna lain.