抑制从awk脚本调用的系统命令

时间:2015-06-15 20:08:20

标签: windows awk system

我目前正在Windows 7中运行此脚本。

所以,我有一个程序,用于对来自另一个命令(mkmk)的输出进行颜色编码,并计算出不同数量的错误和其他值得注意的统计数据等。所以现在,它以批处理文件的形式开始

  1. 关闭回声
  2. 将一些颜色值设置为变量
  3. 一起调用mkmk命令和awk脚本
  4. 然后,awk脚本逐行解析,并调用一个函数,然后调用执行着色的exe。作品如下:

    /: error/ {
        CntError++ ;
        TraError[CntError] = $0;
        colorf(cErrorDcb,$0) ;
        next
    }    
    
    function colorf(fg, str ) {
       if ( Couleur < 1 )
       {
         printf("%s\n",str);
       }     
       else
       { 
          if ( System == "UNIX" )
          {
             printf("%s%s%s%s\n",fg,bg,str,NORMAL);
          }
          else 
          {
             system("Colorize.exe /c:" fg " \""  str "\"");
             printf("\n");
          }
       }
    }
    

    所以,一切正常,除了每次调用系统(“Colorize.exe”)(很多)之外,命令在终端输出并使输出变得混乱。它似乎不受我的批处理文件中的@echo off命令的影响,因为它在awk脚本中被调用。反正有没有隐藏这些系统命令,但保留我的其余awk输出?

1 个答案:

答案 0 :(得分:1)

我不知道神奇的Windows咒语是什么来控制终端上显示的内容,但通常不是调用system()而是让它调用的命令产生它自己的输出“#1}}混入使用awk输出,使用getline读取调用的结果以填充变量,然后从awk打印出来。像这样:

/: error/ {
    TraError[++CntError] = $0
    print colorf(cErrorDcb,$0)
    next
}    

function colorf(fg, str,         cmd, line, colorStr) {
   if ( Couleur < 1 ) {
      colorStr = str
   }     
   else if ( System == "UNIX" ) {
      colorStr = fg bg str NORMAL
   }
   else {
      cmd = "Colorize.exe /c:" fg " \""  str "\""
      colorStr = ( (cmd | getline line) > 0 ? line : str )
      close(cmd)
   }
   return colorStr
}

我也摆脱了所有无用的冒号。

最佳建议 - 获取cygwin