我想处理一个日志文件(使用C),其中数据由双冒号“::”分隔。我认为像awk
和sed
这样的工具可以非常有效地执行此操作。但是awk输出值是否可以传递给我的C变量?
例如,一个日志信息是这样的:
a::b::c::d
我有一个struct
由4个int
元素组成。如何将4个部分保存到struct元素中?
我曾想过用strtok
libary调用作为另一种方式,但在调用它之前,我必须从一大堆日志信息中挑选出合适的行,这让我更多地考虑{{1} }或sed
。
谢谢您的帮助。如果你有更好的选择,那将是非常友好的分享。
更新:我忘了强调上面提到的所有内容都是在运行时中完成的,包括“根据给定值对匹配的行进行排序”,然后处理它们,然后存储值。 grep
很好,但如果scanf
值中包含空格怎么办?
答案 0 :(得分:1)
我会远离strtok
,直到你确实需要它为止。这可以使用scanf
完成。
scanf("%d::%d::%d::%d", &a, &b, &c, &d);
而且,在sed
,awk
和grep
这三个工具中,它实际上取决于“理清合适的线条”的细节。 grep
可用于检测值。 awk
和sed
是更强大的工具,但它们需要更多的时间来学习(它们都是图灵完备的编程语言)。
答案 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);
当然有正确的错误检查。