我正在尝试将一个小 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/