【问题标题】:Need help AWK script需要帮助 AWK 脚本
【发布时间】:2019-02-25 14:10:56
【问题描述】:

您能告诉我如何通过 awk 在下面的文本中打印“user.%”字符串吗? 'user' 的值不固定,'( )' 中的字符串数不固定。

start user1.table% NOT (%OLD, %2016%)  user.% another strings

更新

它是SQL处理的基础。 $2 表示 schema.table 但这里用户可以使用 '%' 并且也可以通过 NOT 关键字排除。它以')'结尾。下一个是第二个 schema.table,这是我想要捕捉的。 我想我应该用正则表达式解析 ')' 之后的字符串但失败了。

正则表达式:

[)]\s+(\S+)

上面的表达式可以用来捕捉我猜的那个字符串。 我如何在 awk 脚本中应用这个(不是一个衬里)。

【问题讨论】:

  • 嗯?这是某种 Windows 批处理文件吗?什么是 user% - 批处理变量?一些SQL的东西?您需要提供更多上下文。
  • 其实是SQL处理的基础。 $2 表示 schema.table 但这里用户可以使用 '%' 并且也可以通过 NOT 关键字排除。它以')'结尾。下一个是第二个 schema.table,这是我想要捕捉的。谢谢。

标签: awk


【解决方案1】:

如果查询的结构保持不变,你可以这样:

awk -F'[).]' '{print $3".%"}'

我使用右括号或文字点作为分隔符。这样做,感兴趣的值在字段 3 中。

虽然它很简单,但它会在用户面前留下一些空白。我们可以增强字段分隔符正则表达式来解决这个问题:

awk -F')[[:space:]]*|[.]' '{print $3".%"}'

顺便说一句,你也可以使用这个 sed 命令:

sed 's/.*)[[:space:]]*\([^.]*\).*/\1.%/'

或者如果你有 GNU grep,使用这个:

grep -oP '\)\s*\K[^%]*%'

【讨论】:

  • 它在一个班轮中运行良好。顺便说一句,当我把它放在 awk 脚本中时,它只打印 NOT.%。怎么了?开始 {FS=")​​[[:space:]]*|[.]";} {print $3".%"}
  • 你为什么要设置FS=''? FS 应该是')[[:space:]]*|[.]'
  • 在 awk 脚本中,我使用了 FS=")​​[[:space:]]*|[.]";
  • 哦,我明白了。无论如何,我无法重现。看起来您没有在问题中正确指定输入数据。
【解决方案2】:

试试这个(GNU awk):

awk '{match($0, /[)] +([^ ]+)/, var);print var[1];}'

你需要先匹配(GNU awk 函数)。

【讨论】:

  • @POW wrt you cannot use \s since awk does not support it. - 是的。或者至少您正在使用的 awk 版本可以。 match() 的第三个参数是 gawk 特定的,所以既然你已经在使用 gawk,你也可以愉快地使用其他 gawk 扩展,如 \s。您应该在回答中说明它是特定于 gawk 的。
【解决方案3】:

鉴于您发布的示例输入,您只需要:

awk '{print $6}'

例如:

$ echo 'start user1.table% NOT (%OLD, %2016%)  user.% another strings' |
    awk '{print $6}'
user.%

如果这对您不起作用,那么您发布的示例输入不足以代表您的真实输入,因此请编辑您的问题以包含几行真正具有代表性的示例输入以及给定该输入的预期输出。

【讨论】:

  • 感谢您的建议。我更新了“' ( ) '中的字符串数不固定的问题。
  • 您应该更新了示例输入和预期输出以显示一些具有不同布局的行。在文本中说明它只是部分有用 - 我们需要一些可以测试潜在解决方案的东西。