尝试使用sed为Apache http线路日志着色

时间:2014-10-07 11:22:05

标签: regex sed colorize

我们有包含Apache Http客户端输出的日志文件。我们正在看到输出,因为它“通过电线”,它包括如下行:

  

<< HTTP / 1.1 200请求已成功

V形'<<<表示传入,与'>>'相反传出内容。使用'tail -F'来跟踪这些日志是足够有趣的,但我认为使用sed根据输出或输出来着色输出是一个有用的练习。

一个简单的测试将告诉你我的意思:

echo '<< HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i'

输入

echo '>> HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i'

输出

到目前为止,这么好。当我突然想到强调HTTP响应代码并根据类别着色它们会更加有用:例如2xx为绿色,5xx为红色。

到目前为止,我可以匹配响应代码中的第一个数字: echo '<< HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i' -e 's_HTTP[^[:alpha:]]*2\d*_\x1b[32;1m&\x1b[0m_g'

只有着色,<< HTTP/1.1 2。我的期望是HTTP[^[:alpha:]]*2\d*匹配'HTTP',然后是非字母“2”的所有内容,后跟任意数量的数字。理想情况下,我会使用'{2}'而不是'*',但效果相同。

任何正则表达式大师都可以指出我的错误吗?

1 个答案:

答案 0 :(得分:1)

echo '<< HTTP/1.1 200 The request has succeeded' | \
sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_;t http
           s_>>_\x1b[32;1m&\x1b[0m_
:http
           s_HTTP[^[:alpha:]]\{1,\}2[0-9]\{1,\}\x1b[32;1m&\x1b[0m_g'

试试这个。

  • 移除i <<>>行的末尾,因为它绝不是大写或小写
  • *更改{2}\{1,\},但也可以在GNU sed上使用+
  • 使用t http添加可选的:http,因为您肯定会更进一步,一些跳转会使您的扩展程序更快

还尝试-u对于在实际流上更好的无缓冲