【问题标题】:awk -F command to print based on first matched patternawk -F 命令根据第一个匹配的模式打印
【发布时间】:2014-03-13 16:57:38
【问题描述】:

如果 2 个字符串立即匹配,我正在使用 awk -F 命令打印下一组单词。

如果其中一个搜索关键字在变量中重复,则采用最后匹配的关键字模式。但我想要第一个匹配的模式。

编辑: 在下面的示例中,我需要搜索CREATETABLE 关键字,它们可能出现在任何行或被任何单词分割。不管是什么如果有匹配的CREATE & TABLE关键字,打印下一个元素如下。

a="Hello I have a CREATE set or multiset TABLE as TABLE (uid, cid, mid)"
echo "$a" | awk -F"CREATE.*TABLE" '{print $2}'
returns: as (uid, cid,mid)

但预期的输出是

作为表(uid、cid、mid)

【问题讨论】:

  • 如果在-F中的“TABLE”后面加一个空格怎么办? awk -F"CREATE.*TABLE " 这样,第二个就不会和(匹配了。
  • @fedorqui :我编辑了我的问题。第二个也可能有空间
  • 那么你可以使用-F"CREATE[ a-z]*TABLE"
  • @Jotne:它不重复。 fedorqui,如果多个场景有相同的要求,总是让我创建单独的问题
  • 我想知道你是否从得到的答案中学到任何东西。

标签: linux bash shell unix awk


【解决方案1】:

大多数工具在处理正则表达式时会寻找最左边最长的匹配字符串。在你的情况下:

a="Hello I have a CREATE set TABLE as TABLE (uid, cid, mid)"
echo "$a" | awk -F"CREATE.*TABLE" '{print $2}'

由于您在输入行中有两次单词 TABLE,因此您的正则表达式中的 TABLE 将匹配第二个,因此结果是可能的最长匹配。 awk 无法更改正则表达式匹配的行为,其他工具可能有选项让您要求最短而不是最长匹配,但 awk 不会。

你可能想要写的是:

echo "$a" | awk -F'CREATE +[^ ]+ +TABLE' '{print $2}'
 as TABLE (uid, cid, mid)

【讨论】:

  • 您对答案投了反对票,因为您找不到 gawk ???使用另一个 awk。好悲伤。
  • 我在 $a 变量中有多行。它现在没有返回任何东西
  • 我可能有CREATE set or multiset TABLE 所以,它不会工作
  • 如果您希望我们帮助您,至少用一些真实的、有代表性的输入和预期的输出来更新您的问题,并告诉我们您感兴趣的 CREATE 和 TABLE 事件之间可能出现或不能出现的任何内容。否则我们只是在猜测。
  • 您刚刚将 1 个样本更改为另一个样本。您错过了发布示例输入的要点 - 一个示例没有提供足够的信息来帮助某人综合您的要求。祝您问题得到解答。
最近更新 更多