0

1)解决问题后: 处理awk命令时如何将'system()'调用转换为'fork()+ execl()'?

2)我根据melpomene的方法遇到另一个问题:

#define LOG_FILE_PATH "/tmp/logfile"
system("awk -v FS=\"[][]\" -v BEGINTIME=\"$BEGINTIME\" -v ENDTIME=\"$ENDTIME\" '$2>=BEGINTIME && $2<=ENDTIME' "LOG_FILE_PATH);

它工作正常,我得到了我想要的。

3)翻译成fork+execl版本:

sprintf(tmp1, "BEGINTIME=%s", getenv("BEGINTIME"));
sprintf(tmp2, "ENDTIME=%s", getenv("ENDTIME"));
sprintf(tmp3, "$2>=%s && $2<=%s", getenv("BEGINTIME"), getenv("ENDTIME"));
execl("/usr/bin/awk", "awk", "-v", "FS=\"[][]\"", "-v", tmp1, "-v", tmp2, tmp3, LOG_FILE_PATH, (char *)0);

它什么也没输出,为什么?

4

2 回答 2

2

因为tmp3 应该包括文字文本BEGINTIMEENDTIME. 尝试:

sprintf( tmp3, "$2>=%s && $2<=%s", "BEGINTIME", "ENDTIME" );

此外,您可能希望将双引号保留在tmp1and中tmp2

sprintf(tmp1, "BEGINTIME=\"%s\"", getenv("BEGINTIME"));

而且您确实需要检查环境变量是否已实际设置。

此外,您设置的 FS 不正确。在system版本中,awk获取参数FS=[][](shell在调用之前去掉双引号awk。)所以传递给的参数execl应该是"FS=[][]"

于 2013-02-26T11:43:10.723 回答
0

如果您使用的是 Solaris,那么 /usr/bin/awk 是旧的、损坏的 awk,其中许多其他问题不支持-v变量分配。

此外,awk 程序由引号字符分隔,所以我认为你应该这样做:

sprintf(tmp3, "\'$2>=%s && $2<=%s\'", ...);

而不是这个:

sprintf(tmp3, "$2>=%s && $2<=%s", ...);
于 2013-02-26T12:59:07.527 回答