awk print的语法错误

时间:2014-05-25 04:09:09

标签: regex shell awk nawk

以获取如下文字:

std_out_file: ${ALGO_TOP}/dynamic/batchlog/JS030003-ara.stop.badb.out

我希望输出为:

$BATCHLOG_DIR/JS030003-ara.stop.badb.out

这是代码:

nawk '/std_out_file:|std_err_file:/ { split($2, a, /); if ( a[3]=="batchlog" ) print "$$BATCHLOG_DIR/"$3; else print "$$CONSOLELOG_DIR/"$3; }'

我收到以下错误:

nawk: illegal primary in regular expression ); if ( a[3]=="batchlog" ) print "$$BATCHLOG_DIR at ; if ( a[3]=="batchlog" ) print "$$BATCHLOG_DIR
 source line number 4
 context is
        /std_out_file:|std_err_file:/ { split($2, a, /); if ( a[3]=="batchlog" ) print "$$BATCHLOG_DIR/", $3; else print >>>  " <<<

我在哪里弄错了?

1 个答案:

答案 0 :(得分:3)

split函数的第三个参数是正则表达式。您应该将/置于split内部,如:

split($2, a, /\//)

请注意,/需要进行转义才能让awk知道它不是regex模式的开头或结尾。

话虽如此,您可以通过将分隔符设置为split来完全避免/。类似的东西:

awk -F'/' '/std_out_file:|std_err_file:/{print ($(NF-1)=="batchlog" ? "$BATCH" : "$CONSOLE") "LOG_DIR/"$NF}' file

您测试第二个字段$(NF-1)batchlog的位置。三元操作基本上与您的if-else条件做同样的事情。