8

我一直在查看tail -f最近使用的一些服务器日志,并且认为如果我可以格式化输出会更容易看到一些东西。实际上,我正在寻找的只是一种可能为某些单词着色(由正则表达式确定)并可能删除某些单词(再次由正则表达式确定)的方法。

知道 一些程序可以实时可视化服务器日志等等,但我对此更感兴趣。

4

3 回答 3

13

tail -f将into的输出通过管道传输sed,并添加一些ANSI 转义码。例如,以下代码会将所有数字着色为红色(颜色 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"
于 2009-02-04T06:09:29.287 回答
5

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

编辑好的,明白了:

这是一个以深红色输出“Hello”的示例:

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

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

所以真正被发送到屏幕上的是这样的:

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

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

在这种情况下,命令的32m意思是“将前景色设置为 2”,由于颜色 #2 是深红色,终端使用的“笔”现在将是深红色。这意味着从此时起,屏幕上显示的所有文本都将变为深红色。

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

有关所有转义码的列表,请在 [ http://en.wikipedia.org/wiki/ANSI_escape_code Wikipedia] 中查找,或者直接在 google 中查找。

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

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"

它将为“Feb”、“Mar”、“Apr”着色 - 每个都是深红色。

我希望这能让您对如何做您需要的事情有所了解!

于 2009-02-04T06:02:12.203 回答
3

感谢 scraimer 和 Adam,我想出了很多我想要的东西,我想我会在这里分享给其他人:

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/
于 2009-02-04T13:28:44.003 回答