我正在尝试简化由ruby脚本创建的日志,该脚本生成一个简单的日志文件,其中包含时间戳消息和JSON的混合,类似于:
[TIMESTAMP] MESSAGE
[
{
"JSON STUFF HERE"
}
]
[TIMESTAMP]
问题是如果将日志文件保存为.txt,它没有换行符,这使得几乎不可能正则输出。实际上,保留的唯一时间换行符是浏览器html版本,其中文本包含“pre”标记。我用gsub尝试过awk:
gsub( / \[/, /\r\n\[/)
但仍无法在文件中创建换行符。我想知道最简单的方法是加载它格式化,因为我需要自动化该过程。
答案 0 :(得分:0)
这个问题有几个单独的问题,而且我说没有换行符(在JSON部分中)实际上使正则表达式进程更容易(绝对是sed
),但也许我在这里被误解了。
所以说,假设你有python可用,你可以使用它的json module至少为JSON做漂亮打印:
python -mjson.tool logfile.json
请参阅有关缩进和换行的选项的文档。
答案 1 :(得分:0)
也许这足以让你开始。
你可以用awk的另一种方式思考它。 Awk旨在处理"记录"。虽然典型的记录分隔符是换行符,但记录分隔符可以设置为任何有用的单个字符,标准awk或带有GNU awk的正则表达式。
因此,如果您的日志文件如下:
[TIMESTAMP] MESSAGE : Some message [ { "JSON STUFF HERE" } ] [TIMESTAMP] MESSAGE2 : Some other message [TIMESTAMP] ...
它有匹配的括号,但没有换行符,你可以试试像:
awk 'BEGIN {FS="\]|:"; RS="\["} NF==3 && !/\{/ {print $1, $2, $3}' data
,其中
FS
在]
块中设置为:
或BEGIN
RS
在[
块中设置为BEGIN
,而不是使用默认的换行符:
之类的消息分隔符,那么NF==3
对于打印TIMESTAMPS
和MESSAGES
来说是一个简单但不是很好的测试作为字段$1
和$2
。假设$3
是记录的其余部分。JSON
可以包含相同的字段分隔符,因此还可以测试' {'排除短JSON
块。示例数据作为单行导致:
TIMESTAMP MESSAGE Some message
TIMESTAMP MESSAGE2 Some other message
现在显然,模式测试很弱,考虑到MESSAGES
之后的数据可能会有更多:
或]
导致这些记录中的NF
计数更高。在这种情况下,确保$1
匹配特定时间戳格式将提供更好的记录捕获。