Bagaimana agar tail -f menunjukkan output berwarna

265

Saya ingin dapat mengeklik keluaran file log server yang memiliki pesan seperti:

INFO
SEVERE

dll, dan jika itu SEVERE, tunjukkan garis berwarna merah; jika INFOberwarna hijau. Jenis alias apa yang dapat saya siapkan untuk tailperintah yang akan membantu saya melakukan ini?

Amir Afghani
sumber
satu baris sed: stackoverflow.com/a/14691971/52074
Trevor Boyd Smith

Jawaban:

234

Coba multitail . Ini adalah liberalisasi dari tail -f. Anda dapat menonton banyak file di jendela terpisah, menyorot garis berdasarkan kontennya, dan banyak lagi.

multitail -c /path/to/log

Warnanya dapat dikonfigurasi. Jika skema warna default tidak berfungsi untuk Anda, tulis sendiri di file konfigurasi. Misalnya, panggilan multitail -cS amir_log /path/to/logdengan yang berikut ini ~/.multitailrc:

colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE

Solusi lain, jika Anda menggunakan server yang merepotkan untuk menginstal alat yang tidak standar , adalah menggabungkan tail -fdengan sed atau awk untuk menambahkan urutan kontrol pemilihan warna. Ini membutuhkan tail -funtuk menyiram output standarnya tanpa penundaan bahkan ketika output standarnya adalah sebuah pipa, saya tidak tahu apakah semua implementasi melakukan ini.

tail -f /path/to/log | awk '
  /INFO/ {print "\033[32m" $0 "\033[39m"}
  /SEVERE/ {print "\033[31m" $0 "\033[39m"}
'

atau dengan sed

tail -f /path/to/log | sed --unbuffered \
    -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' \
    -e 's/\(.*SEVERE.*\)/\o033[31m\1\o033[39m/'

Jika sed Anda bukan GNU sed, gantikan \o033dengan karakter escape literal dan hapus --unbuffered.

Namun kemungkinan lain adalah untuk menjalankan tail -fdalam buffer shell Emacs dan menggunakan kemampuan pewarnaan sintaks Emacs.

Gilles
sumber
bagaimana Anda bisa melakukan ini sed? (maaf karena malas dan tidak memikirkannya sendiri!) Tapi tolong tambahkan sedcontoh juga.
Ali
5
@ Ali Sed kurang nyaman karena tidak memiliki sintaks untuk karakter escape, Anda harus memilikinya secara harfiah dalam skrip atau menggunakan metode mengutip shell untuk menggunakannya. Saya sarankan Anda menggunakan awk.
Gilles
8
@Gilles Dalam kode tail -fwith Anda awk, jika sebuah string tidak memiliki INFO dan SEVERE , string tersebut tidak akan dicetak. Bagaimana saya bisa mencetak string yang tersisa ? (Tali tidak perlu diwarnai)
Benjamin
6
@Benjamin Tambahkan ; nextsebelum kawat gigi penutup untuk melewati pemrosesan lebih lanjut, dan baris pemrosesan baru 1 {print}di akhir ( 1artinya selalu).
Gilles
3
sed --unbuffered -e 's/\(.*FATAL.*\)/\o033[1;31m\1\o033[0;39m/' -e 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*WARN.*\)/\o033[33m\1\o033[39m/' -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' -e 's/\(.*DEBUG.*\)/\o033[34m\1\o033[39m/' -e 's/\(.*TRACE.*\)/\o033[30m\1\o033[39m/' -e 's/\(.*[Ee]xception.*\)/\o033[1;39m\1\o033[0;39m/'
DmitrySandalov
120

grc , pewarna generik cukup keren.

apt-get install grc

Kerjakan saja

grc tail -f /var/log/apache2/error.log

dan nikmati!

Anda juga akan menemukannya di GitHub .

ini
sumber
2
Inilah yang saya butuhkan: ringan dan sederhana. Pewarnaan tidak tepat untuk jenis log saya (log khusus) tetapi pewarnaan apa pun memudahkan saya untuk mengikuti log.
rennat
Bagi saya 'grc' pada kesalahan Debian dengan: OSError: [Errno 13] Izin ditolak. Itu juga tergantung pada Python yang diinstal sehingga tidak relaly ringan kecuali Anda sudah memilikinya. Saya telah menemukan 'ccze' bekerja lebih baik, ex. 'tail -f -n 50 /var/log/starbound-server.log | ccze -A '.
Daniel Sokolowski
1
Pengaturan default grc di Ubuntu tidak terlihat bagus untuk syslogs atau mail.log. Tidak mudah untuk memahami bagaimana menyesuaikannya.
lepe
1
Saya menemukan cara ini lebih cepat dan lebih mudah untuk diwarnai daripada multitail. Baru saja menginstal cepat melalui sumber pada sistem CentOS saya dan meningkatkan hidup saya. Akan menginstal di sistem saya yang lain juga.
zeeshan
4
Ini terlihat sangat buruk di log nginx i.imgur.com/aJbIOfL.png
mpen
51

Pernahkah Anda melihat ccze ? Anda memiliki kemungkinan untuk menyesuaikan warna default beberapa kata kunci menggunakan opsi -catau langsung di file konfigurasi Anda. Jika layar Anda kosong setelah pewarnaan, Anda harus menggunakan opsi -A.

Sunting:

Jika Anda benar-benar ingin garis lengkap diwarnai merah, Anda juga bisa mencoba yang berikut ini:

$ tail -f myfile.log | perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'

\e[1;31makan memberi Anda warna merah. Jika Anda ingin warna kuning, gunakan \e[1;33m, dan untuk penggunaan hijau \e[1;32m. The \e[0mmengembalikan warna teks normal.

uloBasEI
sumber
1
Ini tidak berfungsi di Mac - Saya memperbaikinya karena bekerja di Linux.
Amir Afghani
Upvoting karena sementara trik perl / ansi mungkin tidak, ccze tidak.
Shadur
1
Anda juga dapat membuat terminal Anda mengirim peringatan atau "beep" dengan menambahkan \007ke akhir regex, seperti: perl -pe 's/(ERROR)/\033[31m$1\033[0m\007/g;'. Ini berfungsi luar biasa jika Anda menggunakan tmux dengan set -g bell-action any, dalam hal ini jika Anda memiliki log tailing di jendela lain, nama jendela itu akan mengingatkan setiap kali regex menemukan kecocokan.
jonyamo
@AmirAfghani Ini adalah situs SE linux / unix, oleh karena itu saya tidak yakin mengapa Anda berpikir itu akan berfungsi pada mac.
BЈовић
1
@ BЈовић Mac adalah Unix.
Chris Down
34

Lihatlah lnav , penampil file log tingkat lanjut.

lnav lnav

Itu juga bisa mencetak berbagai format.

Sebelum:

lnav-sebelum-cantik

Setelah:

lnav-cantik

bagonyi
sumber
Tambahan yang sangat keren untuk kit alat analisis log. Terima kasih untuk sarannya.
Patrik Alienus
24

Anda dapat menggunakan pelangi , yang mewarnai garis berdasarkan ekspresi reguler:

rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log

Itu juga dibundel dengan konfigurasi yang telah ditetapkan , misalnya untuk log Tomcat:

rainbow --config=tomcat tail -f my-file.log

(penafian: saya penulis)

nicoulaj
sumber
2
Saya mencoba sebagian besar solusi lain yang ditawarkan untuk pertanyaan ini, tetapi pelangi adalah satu-satunya yang bekerja dengan baik pada matahari, aix, linux, termux, darwin, dan cygwin - 6 (!) Lingkungan yang saya gunakan setiap hari. Semua yang lain melibatkan proses pembuatan non-portabel yang sulit untuk setidaknya beberapa platform.
Stabledog
1
rainbowMengagumkan. Apakah Anda penulisnya? Jika demikian, harap edit jawaban Anda dengan atribusi itu.
Uskup
ya, maaf, diedit
nicoulaj
15

Anda dapat menggunakan colortail :

colortail -f /var/log/messages
Kartik M
sumber
2
+1 tersedia di repositori Ubuntu. Yang saya suka dari colortail dibandingkan dengan ccze adalah bahwa Anda dapat menyesuaikan pola Anda menggunakan RegEx secara bebas. Warna yang tersedia: hitam, cerah, putih, cerah putih, magenta, brightmagenta, cyan, brightcyan, hijau, green hijau cerah, kuning, cerah di bawah, merah, cerah, biru, cerah. Sayangnya tidak ada cara untuk mengatur warna tebal atau lainnya seperti oranye.
lepe
Saya ingin memperbaiki satu poin tentang komentar saya sebelumnya: "cerah" + warna termasuk "tebal" (beberapa warna juga akan terlihat lebih terang)
lepe
Saya mencoba ini di Ubuntu 18 dan tidak berhasil. Penyiapannya multi-langkah dan instruksinya ambigu. Masih tidak yakin itu bagian yang saya salah; bagian terakhir bisa menjadi lebih jelas "Setelah itu Anda mungkin ingin menyalin dan mengedit contoh file konfigurasi ke tempat lain. Saya memilikinya di ~ / .colortail /"
Dawoodjee
Cukup instal colortail, apt install colortaildan itu akan berfungsi tanpa mengedit ~ / .colortail / juga.
Kartik M
11

Juga perhatikan bahwa jika Anda hanya ingin mencari satu regex yang cocok, GNU grep with --colorakan berfungsi - cukup kirimkan tailoutput Anda melalui itu.

mattdm
sumber
OP hanya ingin menyorot output, bukan memfilternya. Grep tidak akan menampilkan baris yang tidak cocok ...
Coderer
3
Jika Anda mengatakan grep  -A9999  -B9999 regex, itu akan menampilkan semua baris kecuali Anda memiliki 10.000 baris yang tidak cocok dalam satu baris. Gunakan sesuatu seperti GREP_COLORS="ms=31:sl=33:cx=32" grep -A9999 -B9999 SEVEREuntuk menunjukkan kata SEVEREdalam warna merah, sisa garis SEVERE dalam warna kuning, dan semua garis lainnya (non-SEVERE) (hingga 9999) berwarna hijau.
G-Man
Anda mungkin harus beralih --color=alwayske grep bukan hanya --color, tergantung pada urutan pipa Anda, tetapi ya, ini bekerja dengan baik (GNU coreutils) 8.27 diinstal pada kotak saya.
Hank Schultz
7

Untuk mendapatkan output berwarna dari perintah standar seperti grep, Anda harus mengatur ini aliasdi.bashrc

# User specific aliases and functions
alias grep='grep --color=auto'

ketika Anda menangkap sesuatu di file Anda, Anda melihat sesuatu seperti ini, (tetapi mungkin berwarna merah):

[root @ linuxbox mydir] # grep "\ (INFO \ | BEVERE \)" / var / log / logname
entri ini adalah INFO  
SEVERE entri ini adalah peringatan!
entri ini adalah INFO 
entri ini adalah INFO 
SEVERE entri ini adalah peringatan!

jika ingin menggunakan tailatau awkdan ingin agar warna tersebut bertahan untuk sebuah pipa, maka alias tidak cukup dan Anda harus menggunakan --color=alwaysparameter, misalnya:

[root @ linubox mydir] # grep --color = always "\ (INFO \ | SEVERE \)" / var / log / logname | tail -f | awk '{print $ 1}'
ini 
PARAH
ini
ini
PARAH

Jika Anda ingin teks berwarna dengan awkcerita sedikit rumit tetapi lebih kuat, misalnya:

[root @ linubox mydir] # tail -f / var / log / messages | awk '{if ($ 5 ~ / INFO /) cetak "\ 033 [1; 32m" $ 0 "\ 033 [0m"; selain itu jika ($ 1 ~ / BEVERE /) cetak "\ 033 [1; 31m" $ 0 "\ 033 [0m"; lain cetak $ 0} '
entri ini adalah INFO  
SEVERE entri ini adalah peringatan!
ini adalah MASUK lain
entri ini adalah INFO
ini adalah MASUK lain
entri ini adalah INFO 
SEVERE entri ini adalah peringatan!

dengan masing-masing garis dalam warnanya sendiri.

Ada banyak cara lain untuk mendapatkan teks berwarna dari shell dengan alat lain dan mereka dideskripsikan dengan baik oleh anggota lain.

tombolinux
sumber
7

Saya cukup suka colorex . Sederhana, namun memuaskan.

tail -f /var/log/syslog | colorex -G '[0-9]{2}:[0-9]{2}:[0-9]{2}' -b $(hostname)
Brian M. Hunt
sumber
12
bagaimana sesederhana itu?
Eliran Malka
6

Berdasarkan jawaban @uloBasEI, saya sudah mencoba menggunakan ... | perl ... | perl ..., tetapi pipa Linux menjadi sedikit gila dan terlalu lambat. Jika saya meletakkan semua aturan hanya dalam satu perlperintah, itu berfungsi dengan baik.

Misalnya, buat perlfile colorTail.pl seperti di bawah ini:

#!/usr/bin/perl -w

while(<STDIN>) {
    my $line = $_;
    chomp($line);
    for($line){
        s/==>.*<==/\e[1;44m$&\e[0m/gi; #tail multiples files name in blue background
        s/.*exception.*|at .*/\e[0;31m$&\e[0m/gi;  #java errors & stacktraces in red
        s/info.*/\e[1;32m$&\e[0m/gi; #info replacement in green
        s/warning.*/\e[1;33m$&\e[0m/gi; #warning replacement in yellow
    }
    print $line, "\n";
}

Gunakan sebagai:

tail -f *.log | perl colorTail.pl
tail -f *.log -f **/*.log | perl colorTail.pl

CATATAN: Anda juga dapat menggunakannya di MobaXTerm ! Cukup unduh perlplug-in dari situs MobaXTerm .

surfealokesea
sumber
3
tail -f /var/log/logname | source-highlight -f esc -s log

sumber
7
source-highlightbukan perintah yang diinstal secara luas, jadi Anda setidaknya harus memberikan tautan ke situs proyek.
Gilles
Tersedia dalam Fedora 19.
sjas
Dan Ubuntu 12.10.
sjas
Itu terlihat bagus. Ini paket besar dibandingkan dengan yang lain dalam daftar ini (26MB). Ini mendukung daftar besar bahasa. Ini dapat disesuaikan memodifikasi file config yang terletak di: /usr/share/source-highlight/*.lang (Ubuntu). Jika Anda membutuhkan sesuatu yang sederhana, gunakan ccze atau colortail.
lepe
sepertinya itu tergantung pada peningkatan, yaitu sekitar 462MB
ecsos
3

Salah satu solusi yang berfungsi untuk mewarnai semua jenis teks, bukan hanya file log, adalah alat Python, ' colout '.

pip install colout
myprocess | colout REGEX_WITH_GROUPS color1,color2... [attr1,attr2...]

Dimana teks dalam output 'myprocess' yang cocok dengan grup 1 regex akan diwarnai dengan color1, group 2 dengan color2, dll.

Sebagai contoh:

tail -f /var/log/mylogfile | colout '^(\w+ \d+ [\d:]+)|(\w+\.py:\d+ .+\(\)): (.+)$' white,black,cyan bold,bold,normal

yaitu grup regex pertama (parens) cocok dengan tanggal awal dalam logfile, grup kedua cocok dengan nama file python, nomor baris dan nama fungsi, dan grup ketiga cocok dengan pesan log yang datang setelah itu. Ini terlihat seperti:

file log dengan pemformatan berwarna

Perhatikan bahwa garis atau bagian dari garis yang tidak cocok dengan regex saya masih bergema, jadi ini bukan seperti 'grep --color' - tidak ada yang disaring dari output.

Jelas ini cukup fleksibel sehingga Anda dapat menggunakannya dengan proses apa pun, tidak hanya mengekor file log. Saya biasanya hanya menyiapkan regex baru dengan cepat setiap kali saya ingin mewarnai sesuatu. Untuk alasan ini, saya lebih suka colout ke alat pewarnaan logfile khusus, karena saya hanya perlu mempelajari satu alat, terlepas dari apa yang saya warnai: logging, output tes, sintaks menyoroti potongan kode di terminal, dll.

Jonathan Hartley
sumber
1
Saya belum melihat satu jawaban yang mengubah file log sumber
Dani_l
@ Dani_l Benar kamu! Pada saat saya menulis ini, saya pasti telah membingungkan diri saya dengan membalik-balik antara ini dan pertanyaan serupa, yang banyak jawabannya adalah tentang cara mengkonfigurasi logging sehingga karakter ANSI ditulis langsung ke file log itu sendiri. Saya akan menghapus keluhan itu dari jawaban saya.
Jonathan Hartley
2

Shameless plug: Saya menulis sebuah alat bernama TxtStyle yang melakukan sesuatu yang mirip dengan opsi yang disebutkan sebelumnya. Anda dapat menjalankannya sebagai berikut:

tail -f /var/log/syslog | txts --regex '\d+'

Anda juga dapat mendefinisikan gaya yang dinamai dalam file konfigurasi ( ~/.txts.conf) dan menggunakannya seperti:

ifconfig | txts --name ifconfig

( ifconfiggaya didefinisikan di luar kotak)

armandino
sumber
2

grc pasti!

sesuaikan collors Anda dengan regex di file: ~ .grc / conf.tail (atau nama apa pun yang Anda inginkan)

regexp=.*(select .*)$
colours=unchanged,cyan
=====
regexp=.*(update .*)$
colours=unchanged,bold yellow
=====
regexp=.*(insert .*)$
colours=unchanged,bold yellow
=====
regexp=.*(emp=\d+).*
colours=unchanged,reverse green
=====
regexp=.*http.*/rest/contahub.cmds.(.*?)/(\w*).*$
colours=unchanged,green,magenta
=====
regexp=.*http.*/M/.*\.(.*?Facade)/(\w*).*$
colours=unchanged,underline green,underline magenta

garis komando:

grc -c conf.tail tail -f log/tomcat/catalina.out

hasil: tangkapan layar

info untuk mengkonfigurasi grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf

Flavio
sumber
1

Saya menulis fungsi bash yang menerima hingga tiga parameter dan melakukan filter mirip grep pada file teks, dan menampilkan teks ke layar berwarna.

Saya juga ingin melihat fungsi ekor yang akan melakukan ini, tetapi belum menemukannya.

Fungsi ini juga dapat ditingkatkan - Saya menghargai bantuan apa pun tentang cara membuatnya lebih baik.

function multigrep(){

    #THIS WORKS - Recreate this, using input parameters
    #sed -En '/(App)|(Spe)/p' ./flashlog.txt;

    filename="/Users/stevewarren/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt";
    paramString="";

    for element in "$@"
        do
            #echo $element;
            paramString="$paramString($element)|";
        done

    #TRIM FINAL | OFF PARAMSTRING
    paramString=${paramString:0:${#paramString}-1};

    #CREATE SED EXPRESSION - '/($1)|($2)|(...)/p'
    paramString="'/$paramString/p'";

    #CREATE SED FUNCTION, CALL ON FILE
    paramString="sed -En $paramString ./flashlog.txt"

    echo $paramString;
    echo "${txtbld}$(tput setaf 7)" > ./flashlog_output.txt;
    eval $paramString >> ./flashlog_output.txt;
    echo >> ./flashlog_output.txt;
    #cat ./flashlog_output.txt;

    cat ./flashlog_output.txt | while read LINE
    do

        [[  $1 && ${1-x} ]] && 
            if grep -q $1 <<<$LINE; then
                echo "$(tput setaf 3)$LINE"
            fi

        [[  $2 && ${2-x} ]] && 
            if grep -q $2 <<<$LINE; then
                echo "$(tput setaf 7)$LINE"
            fi


        [[  $3 && ${3-x} ]] && 
            if grep -q $3 <<<$LINE; then
                echo "$(tput setaf 6)$LINE"
            fi

    done
}
Steve Warren
sumber
1

Tentu !

Saya menulis panjang pergi fungsi yang disebut "egrepi", berdasarkan definisi variabel 8 warna. Ini berfungsi HANYA disalurkan seperti fungsi berwarna "tail -f".

1. setColors

pertama, fungsi variabel warna untuk dipanggil pada awalnya:


setColors ()
{
set -a
which printf >/dev/null 2>&1 && print=printf || print=print # Mandriva doesn't know about printf

hide='eval tput civis'
show='eval tput cnorm'
CLS=$(tput clear)
bel=$(tput bel)

case ${UNAME} in
AIX)
# text / foreground
N=$(${print} '\033[1;30m')
n=$(${print} '\033[0;30m')
R=$(${print} '\033[1;31m')
r=$(${print} '\033[0;31m')
G=$(${print} '\033[1;32m')
g=$(${print} '\033[0;32m')
Y=$(${print} '\033[1;33m')
y=$(${print} '\033[0;33m')
B=$(${print} '\033[1;34m')
b=$(${print} '\033[0;34m')
M=$(${print} '\033[1;35m')
m=$(${print} '\033[0;35m')
C=$(${print} '\033[1;36m')
c=$(${print} '\033[0;36m')
W=$(${print} '\033[1;37m')
w=$(${print} '\033[0;37m')
END=$(${print} '\033[0m')

# background
RN=$(${print} '\033[6;40m')
Rn=$(${print} '\033[40m')
RR=$(${print} '\033[6;41m')
Rr=$(${print} '\033[41m')
RG=$(${print} '\033[6;42m')
Rg=$(${print} '\033[42m')
RY=$(${print} '\033[6;43m')
Ry=$(${print} '\033[43m')
RB=$(${print} '\033[6;44m')
Rb=$(${print} '\033[44m')
RM=$(${print} '\033[6;45m')
Rm=$(${print} '\033[45m')
RC=$(${print} '\033[6;46m')
Rc=$(${print} '\033[46m')
RW=$(${print} '\033[6;47m')
Rw=$(${print} '\033[47m')

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
;;
*)
# text / foreground
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)

# background
Rn=$(tput setab 0)
Rr=$(tput setab 1)
Rg=$(tput setab 2)
Ry=$(tput setab 3)
Rb=$(tput setab 4)
Rm=$(tput setab 5)
Rc=$(tput setab 6)
Rw=$(tput setab 7)
RN=$(tput setab 8)
RR=$(tput setab 9)
RG=$(tput setab 10)
RY=$(tput setab 11)
RB=$(tput setab 12)
RM=$(tput setab 13)
RC=$(tput setab 14)
RW=$(tput setab 15)
;;
esac

BLUEf=${B}
BLUE=${b}
REDf=${R}
RED=${r}
GREENf=${G}
GREEN=${g}
YELLOWf=${Y}
YELLOW=${y}
MANGENTAf=${M}
MANGENTA=${m}
WHITEf=${W}
WHITE=${w}
CYANf=${C}
CYAN=${c}

OK="${RG}${n}OK${END}"
KO="${RR}${n}KO${END}"
NA="${N}NA${END}"

COLORIZE='eval sed -e "s/{END}/${END}/g" -e "s/{HIGH}/${HIGH}/g" -e "s/{SMUL}/${SMUL}/g" -e "s/{RMUL}/${RMUL}/g" -e "s/{BLINK}/${BLINK}/g" -e "s/{REVERSE}/${REVERSE}/g" -e "s/{REVERSO}/${REVERSO}/g"'
LOWS=' -e "s/{n}/${n}/g" -e "s/{r}/${r}/g" -e "s/{g}/${g}/g" -e "s/{y}/${y}/g" -e "s/{b}/${b}/g" -e "s/{m}/${m}/g" -e "s/{c}/${c}/g" -e "s/{w}/${w}/g"'
HIGHS=' -e "s/{N}/${N}/g" -e "s/{R}/${R}/g" -e "s/{G}/${G}/g" -e "s/{Y}/${Y}/g" -e "s/{B}/${B}/g" -e "s/{M}/${M}/g" -e "s/{C}/${C}/g" -e "s/{W}/${W}/g"'
REVLOWS=' -e "s/{Rn}/${Rn}/g" -e "s/{Rr}/${Rr}/g" -e "s/{Rg}/${Rg}/g" -e "s/{Ry}/${Ry}/g" -e "s/{Rb}/${Rb}/g" -e "s/{Rm}/${Rm}/g" -e "s/{Rc}/${Rc}/g" -e "s/{Rw}/${Rw}/g"'
REVHIGHS=' -e "s/{RN}/${RN}/g" -e "s/{RR}/${RR}/g" -e "s/{RG}/${RG}/g" -e "s/{RY}/${RY}/g" -e "s/{RB}/${RB}/g" -e "s/{RM}/${RM}/g" -e "s/{RC}/${RC}/g" -e "s/{RW}/${RW}/g"'
# COLORIZE Usage:
# command |${COLORIZE} ${LOWS} ${HIGHS} ${REVLOWS} ${REVHIGHS}

set +a
}

2. egrepi

dan fungsi egrepi, efektif dan elegan: siklus warna antara 8 atau lebih warna (kebutuhan Anda) DAN diuji di bawah 3 OS unix yang berbeda, dengan komentar:


# egrepi() egrep with 8 REVERSE cyclic colorations on regexps almost like egrep
# egrepi 
# current script will work for KSH88, KSH93, bash 2+, zsh, under AIX / Linux / SunOS
egrepi ()
{
args=$*
# colorList=wBcgymrN                                                # KSH93 or bash 3+, not for AIX
# set -A color                                                  # needed with older sh
color[0]=$Rw; color[1]=$RB; color[2]=$Rc; color[3]=$Rg; color[4]=$Ry; color[5]=$Rm; color[6]=$Rr; color[7]=$RN; # this is the only one AIX solution
i=0
unset argsToGrep argsSedColor argsPerlColor

for arg in ${args}
do
    [ "${arg}" == "." ] && arg=\\.                              # if you wanna grep "."
    # color=R${colorList:((${RANDOM: -1:1})):1}                     # bash RANDOMized colors
    # color=R${colorList:$i:1} && let i++ && ((i==8)) && i=0                # KSH93 or bash 3+, not for AIX
    argsToGrep="${argsToGrep}${argsToGrep:+|}${arg}"
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${!color}&${w}#gI"            # AIX KSH88 do not recognise this fucking variable double expansion
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${color[$i]}&${w}#gI"         # AIX neither do include sed with Ignore case
    argsPerlColor="${argsPerlColor}${argsPerlColor:+,}s#${arg}#$n${color[$i]}$&${END}#gi"   # So: gotta use perl
    let i+=1 && ((i==8)) && i=0                             # AIX KSH88 do not recognise "let i++"
done
# egrep -i "${argsToGrep}" | sed ${argsSedColor} | egrep -v "grep|sed"              # AIX sed incompatibility with Ignore case
# (($# > 0)) && (egrep -i "${argsToGrep}" | perl -p -e ${argsPerlColor}) || cat         # this line colors & grep the words, will NOT act as "tail -f"
(($# > 0)) && (perl -p -e ${argsPerlColor}) || cat                      # this line just colors the words
}

3. Penggunaan

perintah | egrepi word1 .. wordN

pemulung
sumber
1

Anda mungkin juga ingin melihat jam tangan :

tail -f /var/log/syslog | lwatch --input -

Michael Krupp
sumber
1

Sedangkan untuk kode warna, saya akan menggunakan tput:

red=$( tput -Txterm setaf 1 )
norm=$( tput -Txterm sgr0 )
bold=$( tput -Txterm bold )

Lihat untuk referensi: man tput

Kemudian:

tail -F myfile.log | sed "s/\(.ERROR.*\)/$red$bold\1$norm/g"
Fabien Bouleau
sumber
Terima kasih banyak. Bekerja seperti pesona dengan fungsi shell standar.
vquintans
0

Terbit beberapa waktu lalu utilitas Node Js - log-color-highlight

tail -f file | lch -red error warn -green success
lch -f file -red.bold error warn -underline.bgGreen success
gliviu
sumber