0

1)質問を解決した後: awkコマンドを処理するときに「system()」呼び出しを「fork()+ execl()」に変換するにはどうすればよいですか?

2)メルポメネーの方法によると別の問題が発生します:

#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

3には文字通りのテキストとtmpを含める必要があるためです。試す:BEGINTIMEENDTIME

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

また、おそらく二重引用符をとに保持する必要がtmp1ありtmp2ます。

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

そして、環境変数が実際に設定されていることを実際に確認する必要があります。

また、FSを正しく設定していません。systemバージョンでawkは、引数を取得します(シェルは、FS=[][]呼び出す前に二重引用符を削除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 に答える