shell脚本中的awk代码出错

时间:2013-10-03 21:03:56

标签: shell unix awk

我正在使用ls命令列出要用作输入的文件。对于找到的每个文件,我需要

  1. 执行系统命令(importdb)并写入日志文件。
  2. 如果在步骤1中创建的日志文件的第2列第6行的第一个字符不是“0”,则写入错误日志文件。
  3. 重命名已处理的文件,以便在下次运行时不会重新处理。
  4. 我的剧本:

    #!/bin/sh
    ls APCVENMAST_[0-9][0-9][0-9][0-9]_[0-9][0-9] |
    while read LINE 
     do
           importdb -a test901 APCVENMAST ${LINE} > importdb${LINE}.log
     awk "{if (NR==6 && substr($2,1,1) != "0")      
           print "ERROR processing ", ${LINE} > importdb${LINE}err.log
            }" < importdb${LINE}.log
           mv  ${LINE} ${LINE}.PROCESSED
     done 
    

    这是非常初步的代码,我是新手,但我无法通过下面的解析错误。

    错误上下文是:

    {if (NR==6 && >>>  substr(, <<< awk The statement cannot be correctly parsed.
    

1 个答案:

答案 0 :(得分:6)

的问题:

  • 永远不要引用awk脚本。
  • 始终引用文字字符串。
  • 如果您需要访问-v块中的值或脚本 BEGIN之后,请使用awk -v awkvar="$shellvar" 'condition{code}' file正确传递shell变量awk condition{code}' awkvar="$shellvar"
  • 始终引用shell变量。
  • 有条件应该在外面。
  • 重定向和连接优先级存在歧义,因此请使用括号。

所以修正后的(语法)脚本:

 awk 'NR==6 && substr($2,1,1) != 0 {       
           print "ERROR processing ", line > ("importdb" line "err.log")
      }' line="${LINE}" "importdb${LINE}.log"

你还有很多问题,但由于我不知道你想要达到什么目标,因此难以提出正确的方法......

  • 您不应该解析ls
  • 的输出
  • Awk会读取您不需要使用shell构造循环的文件