查找关键字之间的所有信息

时间:2015-04-14 00:49:16

标签: linux shell ubuntu

我想搜索一个给定的单词并检索一对关键字之间的所有周围行:

我有以下数据

NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
put returns between paragraphs
indent code by 4 spaces
NEW:
here is this
most productive website
this is abc/enlightening/def

现在我想检索两个NEW之间的所有信息,其中包含" enlightening"。也就是说,对于上面的示例输入,我想要以下输出:

OUTPUT:
NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
here is this
most productive website
this is abc/enlightening/def

我知道grep允许我搜索一个单词 - 但它只检索指定数量的行,例如5(由用户指定)给定单词的上方和下方。但是我怎样才能找到linux中任何关键字之间的所有信息(" NEW"在这种情况下)。例如。我在这里指定了分隔关键字为" NEW"并将任何两个新的信息称为段落。所以,我的第一段是:

this is stackoverflow
this is a ghi/enlightening website

我的第二段是:

put returns between paragraphs
indent code by 4 spaces

等等。

现在我想要所有那些带有关键字" enlightening"在他们中。即我想要以下输出:

OUTPUT:
NEW:
this is stackoverflow
this is a ghi/enlightening website
NEW:
here is this
most productive website
this is abc/enlightening/def

1 个答案:

答案 0 :(得分:0)

以下AWK命令应该有效(无论如何mawk - POSIX似乎不允许RS成为任意字符串):

awk -vRS='NEW:\n' -vORS= '/enlightening/ { print RS $0 }' data

说明:

  • -vFOO=BAR是一个变量赋值。

  • RS(记录分隔符)设置为NEW:\n会使记录以NEW:\n分隔,而不是行。

  • ORS设置为空字符串会删除输出记录后的多余空行。 (另一个选择是将其设置为NEW:\n,如果记录完成后显示,则<{1}}。

  • NEW:\n打印记录分隔符,然后打印包含&#34; enlightening&#34;的每条记录的整个匹配记录(/enlightening/ { print RS $0 })。

如果在记录完成后显示分隔符,则可以将命令简化为以下内容:

$0

未指定操作时的默认操作是打印记录。

对于严格的POSIX合规性,在两个awk -vRS='NEW:\n' -vORS='NEW:\n' '/enlightening/' data 之间将行添加到临时缓冲区,并且只有在看到搜索项(可以使用标记)时才打印该缓冲区应该有效,尽管它还有更多复杂。