如何使用grep在`name =`之后获取任何内容?


74

我一直在尝试grep之后的任何内容,仅name=包含空格和字母数字。

例如:

name=some value here

我懂了

some value here

我对此完全陌生,以下grep匹配包括在内的所有内容name=

grep 'name=.*' filename

任何帮助深表感谢。


echo 'name=some value here' | grep -Po 'name=\K[ A-Za-z0-9]*'
LF00

Answers:


125

至于详细的在这里,你想有一个积极的回顾后条款,如:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename

-P使grep使用Perl方言,否则您可能需要转义括号。如别处所述,您还可以附加-o参数以仅打印出匹配的内容。方括号中的部分指定您需要字母数字和空格。

使用肯定的lookbehind子句的优点是“ name =”文本不属于匹配项。如果grep突出显示匹配的文本,则只会突出显示字母数字(和空格)部分。-o参数也将不显示“名称=”部分。而且,如果将其转换为sed之类的其他程序,该程序可能会捕获文本并对其执行某些操作,尽管您也可以使用捕获括号来做到这一点,但您将不会捕获“ name =“部分。


2
grep实际上是否支持积极的后向?
马可

1
我也为此担心,所以我在Windows PC上尝试了它,这就是为什么我必须使用-P参数的原因。它可能支持其他样式(可能不是-G),但我不知道这些元素的正确转义。我正在使用grep 2.5.1。
市场

我使用grep -P来获得此信息:grep:未将-P选项的支持编译为此。这在Ubuntu Hardy(Linux 2.6.24)上。在另一台Linux机器它与一个略有不同的错误信息失败,同样在Solaris 10上
约翰Zwinck

1
@MatthieuRiegler如果您安装gnu grep,即brew install grep --default-names
John Morales,

1
我通常喜欢不太麻烦的\K模式,因为它使我更容易阅读,例如grep -oP 'name=\K[ A-Za-z0-9]*' filename。此外,perl的文档要求提高性能\K。不知道这是否适用于一般的PCRE引擎还是仅适用于perl实施
ardnew,

27

尝试这个:

sed -n 's/^name=//p' filename

它告诉sed默认不打印任何内容(-n),不使用前缀替换前缀,并在替换发生时进行打印。

奖励:如果您真的需要它仅匹配仅包含空格和字母数字的条目,则也可以这样做:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename

在这里,我们添加了一个模式以仅在行($)的末尾匹配空格和字母数字,如果匹配,则将组替换为括号并打印。


1
最有可能是一个非常合适的解决方案,但询问者询问了grep ...,而且它不仅仅与空格和字母数字匹配。
市场

2
仅匹配空格和字母很简单,为此我将添加一些内容。至于仅使用grep,那么,排名靠前的答案现在使用grep AND sed ...至少这仅使用单个进程。:)
John Zwinck

我也喜欢您的回答,因为我现在也很困惑sed。感谢您的提示!
ngaame

7

高克

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

或用bash

str="name=some value here"
IFS="="
set -- $str
echo $1    
unset IFS

要么

str="name=some value here"
str=${str/name=/}


1

grep将在与模式匹配的位置打印整行。要仅打印匹配的模式,请使用grep -o选项。您可能还需要使用sed删除模式的name =部分。

grep -o 'name=[0-9a-zA-Z ]'  myfile | sed /^name=/d

5
为此有两个过程是多余的。如果您必须使用sed,则最好单独使用它。
John Zwinck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.