awk:^反斜杠不是最后一个字符

时间:2014-04-01 10:24:59

标签: awk

有人可以帮忙解决这个问题吗?不知道它给出了什么问题。

ssh root@host1 "tail -f /data1/logs/logger.log | awk '{ if(\$0 ~ /^Mar|^Apr/) { printf(\"\\n%s\",\$0)  } if(\$0 \!~ /^Mar|^Apr/) { printf(\"%s\", \$0);} };' "
root@host1's password:
awk: { if($0 ~ /^Mar|^Apr/) { printf("\n%s",$0)  } if($0 \!~ /^Mar|^Apr/) { printf("%s", $0);} };
awk:                                                     ^ backslash not last character on line

2 个答案:

答案 0 :(得分:0)

您可以使用eval复制行为,而不是对ssh进行测试。我制作了一个测试文件(名为month):

Mar line1
line2 line2
Apr line3

你有(至少)三个选择:

第一个选项

您的两个选项是互斥的,因此您可以通过将命令更改为!来避免完全转义if-else的问题:

eval "awk '{ if (/^Mar|^Apr/) { printf(\"\\n%s\",\$0) } else { printf(\"%s\", \$0) } }' month"

这避免了逃避!的需要。请注意,我已从条件中删除了不必要的$0 ~。默认情况下,匹配是针对整行执行的。

第二个选项

你实际上可以这样做:

eval "awk '/^Mar|^Apr/ { \$0 = \"\\n\"\$0 } { printf(\"%s\", \$0) }' month"
  1. 如果该行匹配,则在其前面加上换行符。
  2. 在所有情况下({ }之前没有条件),请打印该行。
  3. 第三个选项

    如果用单引号包装整个命令,则不需要对!执行任何操作:

    eval 'awk "{ if(/^Mar|^Apr/) { printf(\"\\n%s\",\$0) } if(!/^Mar|^Apr/) { printf(\"%s\", \$0)} }" month'
    

    我推荐其他两个解决方案中的一个,我只是认为如果需要,可以显示你可以在命令中使用!

    所有三种情况的输出:

    Mar line1line2 line2
    Apr line3
    

答案 1 :(得分:0)

以下是awk

的已清理版本
awk '/^Mar|^Apr/ {printf "\n%s",$0;next} {printf "%s",$0}'

这将测试$0(默认,因此需要添加)是以Mar还是Apr开始的 如果yes执行printf "\n%s",$0;next
仅当next未以$0Mar开头时,Apr才会使最终代码成为符文 然后运行printf "%s",$0

或者只是:

awk '/^Mar|^Apr/ {$0="\n"$0} {printf "%s",$0}'