我们有包含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}'而不是'*',但效果相同。
任何正则表达式大师都可以指出我的错误吗?
答案 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
对于在实际流上更好的无缓冲