处理awk命令时'system'为'fork + execv'

时间:2013-02-26 11:35:26

标签: c awk

1)解决问题后:   How to translate 'system()' call to 'fork() + execl()' when dealing with awk command?

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);

它没有输出,为什么?

2 个答案:

答案 0 :(得分:2)

因为tmp 3应包含文字文字BEGINTIMEENDTIME。尝试:

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

此外,您可能希望在tmp1tmp2中保留双引号:

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

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

此外,您正在错误地设置FS。在system版本中,awk获取参数FS=[][](shell在调用awk之前删除双引号。)因此传递给execl的参数应该是"FS=[][]"

答案 1 :(得分:0)

如果您使用的是Solaris,那么/ usr / bin / awk已经过时了,其中很多其他问题都不支持-v进行变量赋值。

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

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

而不是:

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