bash ignorecase casar padrão no arquivo e colorir essa linha, imprimir tudo na tela

1

Eu não tenho quase nenhuma idéia sobre codificação ou bash scripting, então por favor, aguarde comigo e desculpe a minha formatação horrível.

O que eu quero é cat um arquivo de log e destacar certas linhas com cores baseadas em uma correspondência de padrões mas para ignorar maiúsculas e minúsculas . Por exemplo:

  • Quando o arquivo de log tiver a palavra sucesso, torne essa linha verde.
  • Quando encontrar erro, torne a linha vermelha, etc.

Isso é o que eu tenho até agora. Ele é baseado em cat e awk (embora quando eu usei man awk eu consegui man para gawk ). Eu estou usando o Debian Jessie.

 #!/bin/bash

[ $# -ge 1 -a -f "$1" ] && logfile="$1" || logfile="-"
cat $logfile | awk '
/install/ {print "3[32m" $0 "3[39m"}
/success/ {print "3[32m" $0 "3[39m"}
/status/ {print "3[33m" $0 "3[39m"}
/info/ {print "3[33m" $0 "3[39m"}
/error/ {print "3[31m" $0 "3[39m"}
/fail/ {print "3[31m" $0 "3[39m"}
'

Eu usei todo tipo de coisa, mas acabo com todo o meu texto em 1 cor, sem cor, ou o caso não está sendo ignorado. Coisas como IGNORECASE = 1 parecem não funcionar.

Estou feliz em usar outra coisa, pois acabei de beliscar esse script de outra pergunta. Abaixo está exatamente o que eu quero no caso de alguém querer sugerir um novo script.

  1. use um comando seguido por um nome de arquivo e imprima o conteúdo no terminal (usar bash seria ideal)
  2. no meu script, gostaria de adicionar strings para combinar e fazer com que essas linhas em um arquivo de log / texto tenham uma determinada cor quando impressas na tela. por exemplo. encontre o erro da palavra e torne a linha vermelha
  3. ignorar maiúsculas e minúsculas para as palavras que desejo corresponder, por exemplo. encontre a palavra error, ERROR ou qualquer combinação de letras minúsculas, como Error, ERRor, etc. Em seguida, imprima essa linha na tela em uma cor vermelha.

A ideia é poder identificar facilmente partes importantes em alguns dos meus backups e coisas como logs de acesso do apache ou qualquer outra coisa. Eu pretendo encontrar as palavras-chave importantes que eu estou depois e simplesmente adicionando as que estão no meu script.

Abaixo está um trecho do começo e fim de um dos arquivos de log como um exemplo:

INFO: tar attempt number 0
/home/user/domains/
/home/user/domains/website.com/
/home/user/domains/website.com/logs/
/home/user/domains/website.com/logs/Apr-2015.tar.gz.4
/home/user/domains/website.com/logs/Apr-2015.tar.gz
/home/user/domains/website.com/logs/Apr-2015.tar.gz.1
/home/user/domains/website.com/logs/Apr-2015.tar.gz.3
/home/user/domains/website.com/logs/Apr-2015.tar.gz.2
/home/user/domains/website.com/public_html/
/home/user/domains/website.com/public_html/api.php
/home/user/domains/website.com/public_html/index.html
/home/user/domains/website.com/public_html/favicon.ico
/home/user/domains/website.com/public_html/favicon1.ico
SUCCESS: website tar exists.
INFO: DB backup dump, attempt number 0
SUCCESS: DB backup file created.
/home/user/dakka_backups/user_db-Thu.2015-04-30.sql
INFO: CN Website and DB backed up on Thu.2015-04-30.
    
por dakka 15.07.2015 / 03:39

1 resposta

3

Awk tem uma função chamada 'tolower':

cat $logfile | awk '
     tolower($0) ~ /install/ {print "3[32m" $0 "3[39m"; next;}
     tolower($0) ~ /success/ {print "3[32m" $0 "3[39m"; next;}
     tolower($0) ~ /status/ {print "3[33m" $0 "3[39m";  next;}
     tolower($0) ~ /info/ {print "3[33m" $0 "3[39m";    next;}
     tolower($0) ~ /error/ {print "3[31m" $0 "3[39m";   next;}
     tolower($0) ~ /fail/ {print "3[31m" $0 "3[39m";    next;}
     { print; }
'

Com o Bash, você pode usar shopt -s nocasematch para correspondência de padrões insensíveis a maiúsculas e minúsculas. por exemplo.

mystring="AbCdEfG"
shopt -s nocasematch
if [[ ${mystring} == abcdefg ]] ; then
     echo "is a match!!"
fi
    
por 15.07.2015 / 06:35