如何在模式后grep一个字符串?

Posted

技术标签:

【中文标题】如何在模式后grep一个字符串?【英文标题】:How to grep one string after pattern? 【发布时间】:2022-01-08 22:10:43 【问题描述】:

我想在用户定义的关键字之后从文件中获取字符串。例如,如果关键字为“yellow_y”,则预期输出为 acc。

试过grep -oP '(?<=yellow_y).*',但没用。

文件:

yellow      abc \
yellow_x     abc \
yellow_y      acc \
blue     abb \
pink abb \
pink_xx acd \

【问题讨论】:

awk, awk '$1 == "yellow_y"print $2' file 似乎是另一种情况 unix.stackexchange.com/questions/13466/… 这里可以正常使用,这是哪个版本的og grep? 【参考方案1】:

使用您显示的示例,请尝试遵循grep 命令。用 GNU grep 编写和测试。

grep -oP '^yellow_y\s+\K\S+'  Input_file

Online demo for above regex

解释: 简单的解释是,使用 GNU grep-oP 选项,分别用于打印匹配的单词和启用 PCRE 正则表达式。在使用正则表达式匹配条件的主程序中。检查行是否从 yellow_y 开始,后跟 1 个或多个空格,然后使用 GNU grep\K 功能忘记此匹配并匹配 1 个或多个非空格字符,然后将在输出中提供所需的值。

【讨论】:

您知道手册/信息页面中提到 \K 的位置吗?也许这个? perldoc.perl.org/perlre#Extended-Patterns(绝对不会猜到 \K 的意思) @ЯрославРахматуллин,老实说,我是从 SO 本身的大师那里学到的,在您发表评论后,我检查了手册页并提供了帮助,但找不到它(至少在我的 grep 版本中),但在网上搜索我发现这个learnbyexample.gitbooks.io/command-line-text-processing/content/… 有它的网站。但看起来并没有提到太多关于它的细节(尽管他们给出了几个例子)。 谢谢。我根据自己的需要修改它并且它正在工作【参考方案2】:

要获取acc,也可以在这里使用awk,而不是grep

awk '$1 == "yellow_y"print $2' file

这意味着:如果第一个单词(第一个非空白块)是yellow_y,则返回第二个非空白字符块(第二个单词)。

查看online demo:

#!/bin/bash
s='yellow      abc \
yellow_x     abc \
yellow_y      acc \
blue     abb \
pink abb \
pink_xx acd \'
awk '$1 == "yellow_y"print $2' <<< "$s"

输出为acc

【讨论】:

以上是关于如何在模式后grep一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用grep查找多行的模式?

多个字符串和模式使用grep

如何查找不包含给定字符串模式的文件?

在单词字符和逗号的模式之后grep for contents

grep 命令系列:如何在 UNIX 中根据文件内容查找文件

如何 grep 字符串的目录,将其重写为其他内容并保存在 bash 中? [复制]