使用星号登录grep


87

我正在尝试在linux / bash中的特定文件中搜索子字符串“ abc”

所以我做:

grep '*abc*' myFile

它什么也不返回。

但是,如果我这样做:

grep 'abc' myFile

它正确返回匹配项。

现在,这对我来说不是问题。但是,如果我想grep输入更复杂的字符串怎么办?

*abc * def *

我将如何使用grep完成它?


3
grep本身在大多数平台上不支持通配符。您必须使用egrep来使用通配符。外壳具有不同的语法。外壳中的“ *”为<任意字符串>。在egrep中,它是一个运算符,表示“对许多先前的实体为0”。在grep中,它只是一个常规字符。
PanCrit

@PanCrit:*在grep和egrep中含义相同:它是一个量词,表示零个或多个前面的原子。这与Shell使用的通配符完全不同。
艾伦·摩尔

Answers:


123

星号只是一个重复运算符,但是您需要告诉它重复的内容。/*abc*/匹配包含ab和零个或多个c的字符串(因为第二个*在c上;第一个无意义,因为没有重复的内容)。如果您想匹配任何内容,则需要说.*-点表示任何字符(在某些准则内)。如果您只想匹配abc,则可以说grep 'abc' myFile。对于更复杂的匹配,您需要使用.*-grep 'abc.*def' myFile将匹配一个包含abc的字符串,后跟def以及介于两者之间的任意内容。

根据评论更新:

*正则表达式中的字符与控制台中的*不完全相同。在控制台中,*是glob构造的一部分,并且仅充当通配符(例如,ls *.log将列出所有以.log结尾的文件)。但是,在正则表达式中,*是修饰符,表示它仅适用于其前面的字符或组。如果希望*在正则表达式中充当通配符,则需要使用.*前面提到的内容-点是通配符,星号在修改点时表示找到一个或多个点;即。查找任何一个或多个字符。


1
我认为提问者对shell通配符和正则表达式之间的区别感到困惑。我还怀疑更复杂的表达方式是:grep'abc。* def'(至少存在一个空格-可能是我写的两个空格)。
乔纳森·莱夫勒

1
实际上,提问者似乎并不了解'abc'与'^ abc $'不是同一件事:-D
Massa

1
是的,我对glob和完整正则表达式感到困惑。我用*不带点表示匹配外壳上的任何内容。
圣杯

1
grep*表示“ 0或更多”,默认情况下grep为贪婪。请注意,在grep的基本正则表达式的元字符 ?+{|(,和 )失去了特殊的意义。更多信息:grep regexps
KrisWebDev 2015年

24

点字符表示与任何字符匹配,因此.*表示任何字符出现零次或多次。您可能打算使用.*而不是仅仅*


点是一个元字符,可以接受除换行以外的任何字符。
Abhishek Kamal

12

“星号”只有在其前面有东西时才有意义。如果没有该工具(在这种情况下为grep),可能会将其视为错误。例如:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

5
*不是没有意义的;它只是没有通常的含义(重复),而是表示“我是明星”。它将匹配包含星号,后跟x,y和z的行。
乔纳森·勒夫勒

2
@Jonathan取决于工具。


6

您尝试过的表达式(例如在Linux中在shell命令行上运行的表达式)被称为“ glob ”。Glob表达式不是完整的正则表达式,这是grep用于指定要查找的字符串的内容。是(旧的,小的)关于差异的文章。全局表达式(如“ ls *”中所示)由外壳程序本身解释。

可以从glob转换为RE,但是通常您需要这样做。


1
如果它是由Shell解析的,那么这只是一个问题。由于他将搜索字符串保留在单引号内,因此外壳程序不理会该字符串,而是将其完整地在argv中传递给grep。
出色的编译器,2009年

4

您没有使用正则表达式,因此您选择的grep变体应为fgrep,其行为将与您期望的一样。


2
fgrep现在已弃用,grep -f应改为使用。
Prometheus

1
那就是“ grep -F”。好的ol'fgrep可能已被“弃用”,但在我还活着的时候,他们不会把它拿走。
安德鲁·比尔斯


1

这可能是您要寻找的答案:

grep abc MyFile | grep def

唯一的事情是...它将输出行“ def”在“ abc”之前或之后


1

这对我有用:

grep“。* $ {expr}”-带有双引号,后跟点。其中“ expr”是您在行尾需要的任何字符串。

标准unix grep,无附加开关。


0

“ *”用作上一项的修饰符。因此,“ abc * def”搜索“ ab”,后跟0或多个“ c”,后跟“ def”。

您可能想要的是“ abc。* def”,它搜索“ abc”,后跟任意数量的字符,后跟“ def”。

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.