【问题标题】:Awk json log file which are greater that a time大于一次的 awk json 日志文件
【发布时间】:2016-03-26 16:17:43
【问题描述】:

我有一个日志文件,每一行都是一个长的 json 字典。没有日志具有相同的长度,但它们都有一个 '_time_' 键,它是以 毫秒 为单位的纪元时间。我想在这个日志文件中搜索以提取大于 1450616426(second)等时间的日志。一些日志示例如下:

{'id':Bob, 'last-login':'...', '_time_':1444211444123456, ...}
{'name':'ehsan', 'family':'toghian', 'last-login':'2015-4-12', '_time_': 1444215425123465, .....}

如何编写 awk 命令?提前致谢。

【问题讨论】:

  • 在提供您希望根据某些条件搜索的示例输入时,最好包含一些符合您的条件的行和一些不符合您的条件的行,否则只包含一个脚本 @987654322 @ 将产生预期的输出。这是该站点上一个非常常见的问题,即有人发布问题并接受从该输入产生预期输出的第一个答案,即使被告知它将因其他输入而失败或在其他方面是一个糟糕的解决方案。说到输出,你的输出不见了——总是提供预期的输出来配合你提供的输入。

标签: json linux search awk command


【解决方案1】:
$ cat tst.awk
{
    milli = $0
    sub(/.*_time_[^[:digit:]]+/,"",milli)
    sub(/[^[:digit:]].*/,"",milli)
    secs = milli / 1000
}
secs > tgt

$ awk -v tgt=1450616426 -f tst.awk file
{'id':Bob, 'last-login':'...', '_time_':1444211444123456, ...}
{'name':'ehsan', 'family':'toghian', 'last-login':'2015-4-12', '_time_': 1444215425123465, .....}

或者使用 GNU awk 来实现 gensub():

$ awk -v tgt=1450616426 '(gensub(/.*_time_[^[:digit:]]+([[:digit:]]+).*/,"\\1",1) / 1000) > tgt' file
{'id':Bob, 'last-login':'...', '_time_':1444211444123456, ...}
{'name':'ehsan', 'family':'toghian', 'last-login':'2015-4-12', '_time_': 1444215425123465, .....}

【讨论】:

    【解决方案2】:

    呆呆

     awk -vl=1450616426 '{match($0,"_time_.: *([0-9]{10})[0-9]+",a);if(a[1]>l)print}' file
    

    【讨论】:

    • 说“它不起作用”就像把你的车送到修理工那里,然后只告诉他们“它不起作用”。如果没有一些场景和症状(您执行了什么命令行、输入什么、发生了什么错误消息、输出等),我们绝对无法帮助您调试问题。只要您对“不起作用”的脚本感到满意,那很好,但是如果您需要帮助,则需要给我们一些线索,了解您需要什么帮助。
    • @A-Ray - 切勿在任何语言的任何代码中使用名为 l 的变量,因为它看起来太像数字 1,在某些字体中完全无法区分。我曾经花了几个小时试图帮助某人调试一个我们无法弄清楚的语法错误,直到我让她重新输入我面前的代码并注意到她输入了l(el)而不是1(一)当我问她为什么告诉我这是因为她参加了打字课程并且教练教她打字l1更快所以她应该总是这样做,因为它们看起来一样无论如何。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多