c - C 程序中与 awk 语法冲突

标签 c gcc awk

我正在尝试将一个小 awk 脚本集成到 C 程序中,但每次尝试编译它时,都会出现语法错误,因为 gcc 认为它是 C 语言,尽管事实并非如此。

    terminal_monitor = popen("awk '{if(l1){
    download=($2-l1)/1024
    download_round=sprintf("%.2f kB/s", download)
    upload=($10-l2)/1024
    upload_round=sprintf("%.2f kB/s", upload)
    print download_round, upload_round
}
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");

这是 gcc( http://pastebin.com/fm8FAZjD ) 的输出:

root@ubuntu:~/Desktop# gcc monitor.c -o monitor
monitor.c: In function ‘main’:
monitor.c:8:26: warning: missing terminating " character [enabled by default]
 terminal_monitor = popen("awk '{if(l1){
                          ^
monitor.c:8:1: error: missing terminating " character
 terminal_monitor = popen("awk '{if(l1){
 ^
monitor.c:9:5: error: ‘download’ undeclared (first use in this function)
     download=($2-l1)/1024
     ^
monitor.c:9:5: note: each undeclared identifier is reported only once for each function it appears in
monitor.c:9:15: error: ‘$2’ undeclared (first use in this function)
     download=($2-l1)/1024
               ^
monitor.c:9:18: error: ‘l1’ undeclared (first use in this function)
     download=($2-l1)/1024
                  ^
monitor.c:10:5: error: expected ‘)’ before ‘download_round’
     download_round=sprintf("%.2f kB/s", download)
     ^
monitor.c:14:1: error: too few arguments to function ‘popen’
 }
 ^
In file included from monitor.c:1:0:
/usr/include/stdio.h:873:14: note: declared here
 extern FILE *popen (const char *__command, const char *__modes) __wur;
              ^
monitor.c:14:1: error: expected ‘;’ before ‘}’ token
 }
 ^
monitor.c: At top level:
monitor.c:15:1: error: expected identifier or ‘(’ before ‘else’
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
 ^
monitor.c:15:21: error: expected identifier or ‘(’ before ‘}’ token
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                     ^
monitor.c:15:22: warning: missing terminating ' character [enabled by default]
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                      ^
monitor.c:15:21: error: missing terminating ' character
 else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
                     ^
monitor.c:16:1: error: expected identifier or ‘(’ before ‘if’
 if (terminal_monitor == NULL) {
 ^
monitor.c:20:1: error: expected identifier or ‘(’ before ‘while’
 while (terminal_monitor!= NULL){
 ^
monitor.c:25:1: error: expected identifier or ‘(’ before ‘return’
 return 0;
 ^
monitor.c:26:1: error: expected identifier or ‘(’ before ‘}’ token
 }
 ^

有什么方法可以告诉 gcc 这不是 C 并且它应该像普通字符串一样处理吗?

最佳答案

“整合”是什么意思?如果您只想让您的 C 程序包含 AWK 源代码,则它需要是正确的 C 字符串。

您可以通过用反斜杠转义双引号来嵌入双引号,“这里是一个带引号的字符串:\“hello\””

对于较长的文本片段,使用 C 的自动连接相邻字符串文字会很方便,它使您不必使用续行:

const char *awkcode =
"awk '{if(l1){"
"download=($2-l1)/1024"
"download_round=sprintf(\"%.2f kB/s\", download)"
"upload=($10-l2)/1024"
"upload_round=sprintf(\"%.2f kB/s\", upload)"
"print download_round, upload_round"
"}"
"else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev)"
" <(sleep 1; grep eth0";
" /proc/net/dev)\", \"r\");"

这很难读,但可以改进。

关于c - C 程序中与 awk 语法冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313171/

相关文章:

c++ - 是否喜欢更长的生命周期/更大范围的局部变量?

perl - 在 AWK 中调用 Perl 脚本

datetime - 在 AWK 中转换日期

c - "Undefined symbols for architecture x86_64:"在c中是什么意思?

c - 如何关闭C源代码中的指定警告?

ubuntu - 错误 : command 'x86_64-linux-gnu-gcc' failed with exit status 1

linux - 在末尾用数字替换重复的用户名

c - MATLAB C Mex 文件中的 OpenMP 仅生成 1 个线程

c - 数组名不能是左值是什么意思?

c - switch_root 和 run_init 有什么区别?