Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C实现高效地处理日志文件_C_Logging_Sed_Awk - Fatal编程技术网

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

如何使用C实现高效地处理日志文件,c,logging,sed,awk,C,Logging,Sed,Awk,我想处理一个日志文件(使用C),其中数据由两个冒号分隔:“。我认为像awk和sed这样的工具将非常有效地实现这一点。但awk输出值是否可能传递给我的C变量? 例如,一个日志信息如下所示: a::b::c::d 我有一个struct由4个int元素组成。如何将4个部分保存到结构元素中? 我曾想过使用strtoklibary调用作为另一种方式,但在调用它之前,我必须从一大堆日志信息中挑选合适的行,这使我更多地考虑sed或grep 谢谢你的帮助。如果你有更好的选择,那将是非常感谢你分享它 更新:

我想处理一个日志文件(使用C),其中数据由两个冒号分隔:“。我认为像
awk
sed
这样的工具将非常有效地实现这一点。但awk输出值是否可能传递给我的C变量? 例如,一个日志信息如下所示:

a::b::c::d  
我有一个
struct
由4个
int
元素组成。如何将4个部分保存到结构元素中?
我曾想过使用
strtok
libary调用作为另一种方式,但在调用它之前,我必须从一大堆日志信息中挑选合适的行,这使我更多地考虑
sed
grep

谢谢你的帮助。如果你有更好的选择,那将是非常感谢你分享它


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

我会远离
strtok
,直到你真正需要它。这可以通过
scanf
完成

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

而且,在三种工具
sed
awk
grep
中,它实际上取决于“整理合适的行”的细节
grep
可以检测值
awk
sed
是更强大的工具,但它们需要更多的时间来学习(它们都是图灵完整编程语言)。

在您真正需要它之前,我不会使用
strtok
。这可以通过
scanf
完成

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

而且,在三种工具
sed
awk
grep
中,它实际上取决于“整理合适的行”的细节
grep
可以检测值
awk
sed
是更强大的工具,但它们需要更多的时间来学习(它们都是图灵完整编程语言)。

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


假设您有一个指向结构的指针“s”,其中包含4个整数字段和一个打开的文件“logfile”:


你总是可以混合使用各种工具。例如,假设您的日志文件位于文件
log.out

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

grep "^-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+$" log.out
您可以将其存储为另一个文件,也可以直接将其提供给您的程序:

grep ... | ./analyze_data
假设您的程序名为
analyze\u data
。在程序源代码中,您只需读取
stdin
并存储所需的值:

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

当然,通过正确的错误检查。

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

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

grep "^-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+$" log.out
您可以将其存储为另一个文件,也可以直接将其提供给您的程序:

grep ... | ./analyze_data
假设您的程序名为
analyze\u data
。在程序源代码中,您只需读取
stdin
并存储所需的值:

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

当然有正确的错误检查。

Nice。我忘了它是一个结构+1但是在logfileNice中有很多这样的行。我忘了它是一个结构+1但是在日志文件
grep
中有很多这样的行可以完成这项工作。我只需要对包含给定值的行进行排序。而
awk
可以将输入分成4个部分(
$1
$2
…)。让我恼火的是,我需要在运行时执行此操作,因此我可以将
$1
传递到
$4
到自定义变量吗?忘记
int
。对于包含空格的字符串值,
scanf
无法正常工作。
grep
可以完成此工作。我只需要对包含给定值的行进行排序。而
awk
可以将输入分成4个部分(
$1
$2
…)。让我恼火的是,我需要在运行时执行此操作,因此我可以将
$1
传递到
$4
到自定义变量吗?忘记
int
。对于内部带有空格的字符串值,
scanf
无法正常工作。感谢您的帮助,但是如果我需要在运行时执行此操作,并且日志文件行包含内部带有空格的描述字符串,该怎么办?如果日志文件是另一个程序的输出,您可以轻松地将其导入
grep
。但是如果你真的想用C来完成所有的事情,我可以帮你。但是,从另一个答案的评论中,我看到您说:
对于包含空格的字符串值,scanf无法正常工作
。那么这些字符串是如何分隔的呢?使用
::
?是的,假设字符串值不包含任何双冒号。为了精确起见,我有两个函数(
writelog
readlog
)在一个日志文件上运行。至于
writelog
我可以简单地
打开它并将日志附加到文件中。但是对于
readlog
,我不知道应该如何对匹配的
n
行进行排序,逐行分离元素,并将它们分别存储到
n
结构中。现在,我正在使用
popen
并将命令
grep''日志文件传递给它,然后每次
getline
一行,但仍停留在如何分离元素上。非常感谢您的回复。我认为最好的方法是打开日志文件,逐行阅读。然后,一旦你完全阅读了一行,试着看看它是否符合你正在寻找的模式。您可以使用
strstr
查找行中
s的位置(如果失败,则忽略该行)。然后,可以很容易地从
::