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"
  1. 如果该行匹配,则在其前面加上换行符。
  2. 在所有情况下(在 之前没有条件),打印该行。

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(默认,所以需要添加)是否以MarApr开头 如果yesprintf "\n%s",$0;next。 只有当next没有以$0Mar开头时,Apr才能使最终代码成为符文 然后运行printf "%s",$0

要不就:

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

以上是关于awk:^反斜杠不是最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QFileDialog 使用斜杠而不是反斜杠?

为啥JSON字符串当中会出现反斜杠?

反斜杠瘟疫和重新分裂的问题

为什么QFileDialog使用斜杠而不是反斜杠?

URL最后结尾反斜杠(/)加与不加区别

Python原始字符串无法在字符串结尾加上反斜杠的处理方式