【问题标题】:grep or C code to parse log file?grep 或 C 代码来解析日志文件?
【发布时间】:2013-03-13 05:23:22
【问题描述】:

我有一个想要解析的日志文件

我只需要前两个字段(用空格隔开)

日志文件中的示例行:

1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIRECT/22.22.22.22 text/html

第一个字段应该没有“。”之后的数字

我以为我可以用 C 来做到这一点,但是如果有一个指针来跟踪每个字符以检查它是空格还是“。”,那会非常复杂。 所以我在这里的一些帖子中看到 grep 可以完成这项工作 但我文件中的字段没有固定长度

我应该在 C 中做吗?或者 grep 中有一个选项可以让我解析

提前致谢

【问题讨论】:

    标签: c parsing awk grep


    【解决方案1】:

    这就是 awk 的用途。

    cat logfile | awk '{print $1 " " $2}' | sed 's_\.[0-9]*__g'
    

    您使用awk 打印每行的第一个和第二个字段。然后匹配小数位并使用sed 删除它们。

    【讨论】:

    • 哦!我不知道这个!谢谢! :D
    • +1 但您正在使用三个进程,其中一个就足够了。 (解析单个文件时不成问题)
    • 我要为同一个文件中的数千行执行此操作。我认为下面的答案之一仅使用 awk
    • UUOC 和 UUO sed。只需单独使用 awk 或单独使用 sed。
    【解决方案2】:
    $ cat file
    1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIR
    ECT/22.22.22.22 text/html
    
    $ awk -F'[ .]' '{print $1,$3}' file
    1362960460 19
    
    $ sed 's/\([^.]\)\.[^ ]* \([^ ]*\).*/\1 \2/' file
    1362960460 19
    

    【讨论】:

    • 这样使用字段分隔符的缺陷是,如果第一个字段缺少小数部分,那么$3 将是 27 而不是 19。
    • 是这样吗?我怀疑不是。在某些时候,我们必须依赖 OP 发布代表性示例输入,如果“。”可以在第一个字段中不存在或者可以出现在第二个字段中,或者如果其中一个字段可以在引号内有空格或其他任何内容,那么这对他们来说显然很重要。
    【解决方案3】:

    要获取文件的前 2 个字段,请使用 awk(包含在所有 unix 或 linux 发行版中)

    awk '{split($1,a,"."); print a[1], $2}' logfile
    

    解释:

    • split 函数根据分隔符 . 将第一个标记 ($1) 拆分为数组 a
    • print a[1], $2 根据输出字段分隔符打印两个值,默认为空格

    更简单的方法(假设第一个字段是数字)是使用int 函数:

     awk '{print int($1), $2}' logfile
    

    【讨论】:

    • 谢谢 :) 这真的很有帮助
    • awk 包含在所有 UNIX 或 linux 发行版中,而不是大多数发行版中。它是一个标准的 UNIX 工具,如 grep、sed、diff 等。
    • 如果第一个字段可以在“.”之前包含非数字,则您发布的更简单的方法将失败。明白我的意思是什么,必须依赖发布的示例输入具有代表性? OP所说的只是“。”之后有数字。
    【解决方案4】:

    BSD 版本(即 OSX)

    cat logfile | awk '{print $1, $2}' | sed -e 's;\.*;;g'
    

    【讨论】:

    • 该 sed 命令说“在每一行中查找以任何字符 (.) 的任何零个或多个重复 (*) 序列开头的第一个字符串并将其删除”,因此它将删除所有文本每个输出行。
    • @EdMorton 不在 bsd sed 中。无论如何,我明天会在我的 Mac 上重新检查
    • 它与 bsd 或其他任何东西无关。您指定的 BRE 为“.*”,这正是我在任何平台上的任何工具中所说的。它不能意味着任何其他东西 - 它是最基本的。
    • @EdMorton。你是对的,它必须是转义的,实际上它是,但它被评论编辑器删除了。
    猜你喜欢
    • 2017-11-10
    • 2011-12-27
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多