awk:^反斜杠不是最后一个字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
答案
您可以使用eval
复制行为,而不是测试ssh。我制作了一个测试文件(称为month
):
Mar line1
line2 line2
Apr line3
你有(至少)三个选择:
First option
您的两个选项是互斥的,因此您可以通过将命令更改为!
来避免完全转义if-else
的问题:
eval "awk ' if (/^Mar|^Apr/) printf(\"\\n%s\",\$0) else printf(\"%s\", \$0) ' month"
这避免了逃离!
的需要。请注意,我已从条件中删除了不必要的$0 ~
。默认情况下,匹配对整行执行。
Second option
你实际上可以这样做:
eval "awk '/^Mar|^Apr/ \$0 = \"\\n\"\$0 printf(\"%s\", \$0) ' month"
- 如果该行匹配,则在其前面加上换行符。
- 在所有情况下(在
Third option
如果用单引号包装整个命令,则不需要对!
执行任何操作:
eval 'awk " if(/^Mar|^Apr/) printf(\"\\n%s\",\$0) if(!/^Mar|^Apr/) printf(\"%s\", \$0) " month'
我推荐其他两个解决方案中的一个,我只是认为如果你需要,你可以在命令中使用!
是值得的。
所有三种情况的输出:
Mar line1line2 line2
Apr line3
另一答案
这是你的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'
以上是关于awk:^反斜杠不是最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章