Shell-Script

文件中的bash忽略大小寫匹配模式並為該行著色,全部列印到螢幕上

  • January 13, 2019

我想要的是cat一個日誌文件,並根據模式匹配用顏色突出顯示某些行,但忽略case。例如:

  • 當日誌文件包含成功一詞時,將該行設為綠色。
  • 當它發現錯誤時,將該線變為紅色等。

這就是我到目前為止所擁有的。它基於 cat 和 awk (儘管當我使用時,man awk我得到了 mangawk代替)。我正在使用 Debian Jessie。

#!/bin/bash

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

我用過各種各樣的東西,但最終我的所有文字都是一種顏色,沒有顏色,或者沒有忽略大小寫。IGNORECASE=1 之類的東西似乎不起作用。

我很高興使用其他東西,因為我剛剛從另一個問題中提取了這個腳本。以下正是我想要的,以防有人想建議一個新腳本。

  1. 使用命令後跟文件名並將內容列印到終端(使用 bash 將是理想的)
  2. 在我的腳本中,我想添加字元串以匹配並在列印到螢幕時使日誌/文本文件中的這些行具有某種顏色。例如。找到單詞錯誤並將該行變為紅色
  3. 忽略我要匹配的單詞的大小寫,例如。找到單詞 error、ERROR 或大寫小寫的任意組合,例如 Error 或 ERRor 等。然後將該行以紅色列印到螢幕上。

這個想法是能夠輕鬆地發現我的一些備份中的重要部分,以及諸如 apache 訪問日誌之類的東西。我打算找到我所追求的重要關鍵詞,然後簡單地將它們添加到我的腳本中。

下面是一個日誌文件的開頭和結尾的片段作為範例:

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.

awk 有一個名為 ’tolower’ 的函式:

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

使用 Bash,您可以shopt -s nocasematch用於不區分大小寫的模式匹配。例如。

mystring="AbCdEfG"
shopt -s nocasematch
if [[ ${mystring} == abcdefg ]] ; then
    echo "is a match!!"
fi

引用自:https://unix.stackexchange.com/questions/216054