我想搜索一个给定的单词并检索一对关键字之间的所有周围行:
我有以下数据
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
答案 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
之间将行添加到临时缓冲区,并且只有在看到搜索项(可以使用标记)时才打印该缓冲区应该有效,尽管它还有更多复杂。