将格式应用于unix shell

时间:2009-02-04 05:45:30

标签: logging tail

我最近一直在使用tail -f查看一些服务器日志,并且认为如果我可以格式化输出,那么看起来要容易得多。真正我正在寻找的是一种方法,可能会为某些单词着色(由正则表达式确定),也许删除某些单词(再次由正则表达式确定)。

I know there's程序可实时显示服务器日志和诸如此类的内容,但我对此更感兴趣。

3 个答案:

答案 0 :(得分:12)

tail -f的输出导入sed,并添加一些ANSI escape codes。例如,以下内容将使用红色(颜色31)和所有带亮黄色的颜色(颜色93)中的所有数字着色:

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`
tail -f file | sed -E "s/([0-9]+)/$RED\1$RESET/g;s/(\"[^\"]*\")/$YELLOW\1$RESET/g"

答案 1 :(得分:5)

我认为您正在寻找的是某种sed脚本,它将围绕您使用ANSI Color转义序列选择的单词。 (嗯... lemme look)。

编辑好的,明白了:

以下是以深红色输出“Hello”的示例:

echo -e "\033[31mHello\033[0m"

发生了什么事?首先,我使用echo -e,以便echo不会将斜杠转换为屏幕斜杠,而是将\033的转义序列作为单个转义字符读取。这实际上只是十进制的33,即27(ESC键的序数)。

所以真正发送到屏幕的是:

<ESC>[32mHello<ESC>[0m

ANSI显示解释为“首先执行命令32m,然后输出”Hello“  执行命令0m

在这种情况下,命令32m表示“将forground颜色设置为2”,并且由于颜色#2是深红色,因此终端使用的“笔”现在将是深红色。这意味着从这一点开始,屏幕上显示的所有文本都将显示为深红色。

当我们输出应该是红色的文本时,我们希望重置颜色,因此我们调用命令0m将颜色重置为正常。

有关所有转义码的列表,请查看[http://en.wikipedia.org/wiki/ANSI_escape_code维基百科]或只是谷歌搜索它。

所以你的sed脚本所要做的就是用颜色包围的单词替换你选择的单词。例如,要替换/var/log/messages中的单词“Feb”,请执行以下操作:

tail /var/log/messages | sed -e "s/Feb/\\o033[31m&\\o033[0m/"

(您可能必须以root身份执行此操作才能实际阅读/var/log/messages

所有sed所做的就是搜索单词“Feb”并用与我们上面使用的相同的转义序列包围它。

您可以将其展开为多个单词着色:

tail /var/log/messages | sed -e "s/\(Feb\|Mar\|Apr\)/\\o033[31m&\\o033[0m/g"

哪个颜色为“2月”,“3月”,“4月” - 每个都是深红色。

我希望这能让你知道如何做你需要的事情!

答案 2 :(得分:3)

感谢刮刀和亚当,我想出了我追求的东西,我想我会在这里为其他人分享:

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`

# line breaks here are just for formatting
tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - 
    \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"
    \(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*
    @\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

# here's the full line if you wanted to copy it
# tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"\(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*@\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

这转变了:

182.108.1.20 - - [04/Feb/2009:23:24:41 +1000] "GET /images/exam_room.jpg HTTP/1.0" 200 8559 "http://www.myserver.com/courses/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

进入此(但有一些颜色):

23:24:41 200 (182.108.1.20)
GET /images/exam_room.jpg
Bytes: 8559
From: http://www.myserver.com/courses/