0

我想处理一个日志文件(使用C),其中数据用双冒号“::”分隔。我想像这样的工具awk并且sed会非常有效地做到这一点。但是 awk 输出值是否有可能传递给我的 C 变量?例如,一个日志信息是这样的:

a::b::c::d  

我有一个struct由 4 个int元素组成的。如何将 4 个部分保存到结构元素中?
我曾想过使用strtoklibary call 作为另一种方式,但在调用它之前,我必须从一大堆日志信息中整理出合适的行,这让我更多地考虑sedor grep
感谢您的帮助。如果你有更好的选择,那将是非常好的你分享它。

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

4

3 回答 3

1

strtok在你真正需要它之前,我会远离它。这可以通过scanf.

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

并且,这三个工具sed中,真正取决于“梳理合适的线条”的细节。可以很好地检测一个值。并且是更强大的工具,但它们需要更多的时间投入来学习(它们都是图灵完备的编程语言)。awkgrepgrepawksed

于 2013-02-04T13:22:49.770 回答
1

假设您有一个指针“s”指向具有 4 个整数字段和一个打开的文件“日志文件”的结构:

    res = fscanf(logfile, "%d::%d::%d::%d", &s->field0, &s->field1, &s->field2, &s->field3);
于 2013-02-04T13:23:17.950 回答
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);

当然有适当的错误检查。

于 2013-02-04T13:24:04.320 回答