【问题标题】:Transform log file using awk使用 awk 转换日志文件
【发布时间】:2018-02-14 06:46:15
【问题描述】:

我有一个 Java 日志文件,并想使用 awk 对其进行转换。该文件具有以下记录结构:

filename:date time [level] (thread) message

这是一个示例行:

2018-01-19-19.prod.com.gz:2018-01-19 19:14:29,964 [INFO] (Runner for {AccountId: ‘1234’, JobFlowId: ‘abcd’, TaskId: ‘4321’, Type: ‘TestType’}) com.damluar.AbstractObjectCache: Found unexpired object in local cache for key: testkey

生成的文件需要有字段并且有 \t 作为分隔符:

  • 数据+时间(已排序)
  • 级别
  • 线程
  • 留言

如果我使用空格或: 作为分隔符,那么threadmessage 字段的内容也会被拆分。处理它的最佳方法是什么?

【问题讨论】:

  • 你至少应该给出一些你的日志作为例子,你怎么看?
  • 线程字段会包含(嵌套(括号))吗?
  • 我发布了一个例子。不,线程不应该有嵌套的括号。
  • 以格式化的方式发布结果文件的片段。结果文件中应该使用什么字段分隔符?
  • tabs 应该是一个分隔符,这样我就可以把它当成 csv 文件了

标签: awk gawk


【解决方案1】:
sed 's/:/:\t/;s/\[/\t&/;s/\]/&\t/;s/)/)\t/' log

以上行将通过tab 分隔必填字段。如果你想输出它们,你可以通过管道将它传递给 awk 来检查:

echo "yourExample"||sed 's/:/:\t/;s/\[/\t&/;s/\]/&\t/;s/)/)\t/'|awk -F '\t' '{for(i=1;i<=NF;i++)print $i}'
2018-01-19-19.prod.com.gz:
2018-01-19 19:14:29,964 
[INFO]
 (Runner for {AccountId: ‘1234’, JobFlowId: ‘abcd’, TaskId: ‘4321’, Type: ‘TestType’})
 com.damluar.AbstractObjectCache: Found unexpired object in local cache for key: testkey

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2014-07-22
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多