如何使用C实现有效地处理日志文件

时间:2013-02-04 13:14:18

标签: c logging sed awk

我想处理一个日志文件(使用C),其中数据由双冒号“::”分隔。我认为像awksed这样的工具可以非常有效地执行此操作。但是awk输出值是否可以传递给我的C变量? 例如,一个日志信息是这样的:

a::b::c::d  

我有一个struct由4个int元素组成。如何将4个部分保存到struct元素中? 我曾想过用strtok libary调用作为另一种方式,但在调用它之前,我必须从一大堆日志信息中挑选出合适的行,这让我更多地考虑{{1} }或sed
谢谢您的帮助。如果你有更好的选择,那将是非常友好的分享。

更新:我忘了强调上面提到的所有内容都是在运行时中完成的,包括“根据给定值对匹配的行进行排序”,然后处理它们,然后存储值。 grep很好,但如果scanf值中包含空格怎么办?

3 个答案:

答案 0 :(得分:1)

我会远离strtok,直到你确实需要它为止。这可以使用scanf完成。

scanf("%d::%d::%d::%d", &a, &b, &c, &d);

而且,在sedawkgrep这三个工具中,它实际上取决于“理清合适的线条”的细节。 grep可用于检测值。 awksed是更强大的工具,但它们需要更多的时间来学习(它们都是图灵完备的编程语言)。

答案 1 :(得分:1)

假设你有一个带有4个整数字段的结构的指针“s”和一个打开的FILE“logfile”:

    res = fscanf(logfile, "%d::%d::%d::%d", &s->field0, &s->field1, &s->field2, &s->field3);

答案 2 :(得分:1)

您可以随时使用混合工具。例如,假设您的日志文件位于文件log.out

然后您可以使用grep选择您感兴趣的行:

grep "^-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+$" log.out

您可以将其存储为另一个文件,直接将其存储到您的程序中:

grep ... | ./analyze_data

假设您的程序名为analyze_data。在程序源中,您只需阅读stdin并存储您想要的值:

scanf("%d::%d::%d::%d", &a, &b, &c, &d);

当然有正确的错误检查。