有人可以帮忙解决这个问题吗?不知道它给出了什么问题。
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
答案 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"
{ }
之前没有条件),请打印该行。如果用单引号包装整个命令,则不需要对!
执行任何操作:
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
未以$0
或Mar
开头时,Apr
才会使最终代码成为符文
然后运行printf "%s",$0
或者只是:
awk '/^Mar|^Apr/ {$0="\n"$0} {printf "%s",$0}'