以获取如下文字:
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 >>> " <<<
我在哪里弄错了?
答案 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
条件做同样的事情。