【问题标题】:awk handling special chars while capturing text between two patternsawk 在捕获两个模式之间的文本时处理特殊字符
【发布时间】:2017-07-15 00:20:12
【问题描述】:

我的脚本中有以下 awk 代码行,它从日志中搜索开始和结束模式之间的文本。

日志看起来类似于:

[zzzz] Static WEB3
[zzzz] capture me
[zzzz] capture me
[zzzz] capture me
[zzzz] end-pattern

可能是

[zzzz] Static WEB1 :: WEB2 :: WEB3
[zzzz] capture me
[zzzz] capture me
[zzzz] capture me
[zzzz] end-pattern

Awk 脚本:

awk "/\[zzzz\] Static ${VAR3} / || /${VAR1} :: ${VAR2} :: ${VAR3} /{flag=1;next} /end-pattern:/{flag=0}flag" /tmp/error.log 

我收到了这些错误:

01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3 / || /WEB1 :: WEB2 :: WEB3 /{flag=1;next}           /end-pattern:/{flag=0}flag
01:18:35 awk: cmd. line:1:                                          ^ syntax error
01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3 / || /WEB1 :: WEB2 :: WEB3 /{flag=1;next}           /end-pattern:/{flag=0}flag
01:18:35 awk: cmd. line:1:                                                                                         ^ syntax error

我不明白为什么我从 awk 获得上述 syntax errors,而上述代码在我的本地机器上完美执行(ubuntu 16.04,带有 bash GNU bash,版本 4.3.46(1)-release)。

我也尝试在: 之前使用\ 来逃避,但是我遇到了不同的问题。

01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3 / || /WEB1 \:\: WEB2 \:\: WEB3 /{flag=1;next}           /end-pattern:/{flag=0}flag
01:18:35 awk: cmd. line:1:                                            ^ backslash not last character on line
01:18:35 awk: cmd. line:1: /\[zzzz\] Static WEB3 / || /WEB1 \:\: WEB2 \:\: WEB3 /{flag=1;next}           /end-pattern:/{flag=0}flag
01:18:35 awk: cmd. line:1:                                                                                             ^ syntax error

我在这里错过了什么?

【问题讨论】:

  • 如果您直接使用值而不是变量,脚本是否有效?
  • 你能提供一个你正在尝试的文件的示例内容吗?
  • 试试这个 - awk "/[zzzz]\ Static\ ${VAR3}/ || /${VAR1} :: ${VAR2} :: ${VAR3} /{flag=1;下一个} /end-pattern:/{flag=0}flag"

标签: bash shell awk sed


【解决方案1】:

切勿在整个脚本(无论是 awk 还是 sed 或其他任何脚本)周围使用双引号,因为它们会让 shell 变量扩展成为脚本主体的一部分,从而导致晦涩的错误和神秘的错误消息(如果你很幸运!)。

要使用 awk 做你想做的事,你将 awk 变量设置为 shell 变量的值,然后在脚本中使用 awk 变量:

awk -v var1="$VAR1" -v var2="$VAR2" -v var3="$VAR3" '
  $0 ~ ("\[zzzz\] Static " var3 " ") || $0 ~ (var1 " :: " var2 " :: " var3 " ") {flag=1;next}
  /end-pattern:/{flag=0}flag
' /tmp/error.log

我没有检查脚本是否有意义,只是修复了使用 awk 变量而不是尝试使用 shell 变量的语法。

【讨论】:

  • 有没有办法处理 -v var1="$VAR1" -v var2="$VAR2" 有时为空,以避免脚本失败?
  • 是的,当然,它是软件,所以有办法做任何事情。一旦您找到了您在此处提出的问题的解决方案,请接受它,然后发布一个后续问题,其中包含简洁、可测试的示例输入和预期输出,以展示您正在尝试解决的新问题。
猜你喜欢
  • 2015-08-26
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2017-03-12
  • 2015-05-14
相关资源
最近更新 更多