如何grep包含下划线的关键字?

tay*_*dee 6 bash

我目前正在搜索一些类似的关键字

find -type f | xargs -grep -i -w 'weblogic_*'

但它显示所有关键字匹配weblogic而不是weblogic_

mkl*_*nt0 7

grep使用正则表达式,而不是globs(通配符表达式).

在正则表达式中,*与前一个字符或表达式相关的量词.因此,_*正在说:零个或多个实例_,所以NO _也将匹配.

你可能想要:

'weblogic_.*'
Run Code Online (Sandbox Code Playgroud)

其中声明任何(.)字符可以跟随_零次或多次.

但请注意,在_.*部分矛盾grep-w标志中结束你的正则表达式,因为它现在只匹配单词边界上正则表达式的开头.

如果你想更明确地说明这一点,你可以使用单词边界断言\b并删除-w选项:

'\bweblogic_'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这允许您省略.*,因为默认情况下grep执行子字符串匹配,如果不感兴趣,则无需匹配行的其余部分.

此外,没有必要xargs:使用内置find-exec主要内容更简单,更有效xargs,可以这么说:

 find . -type f -exec grep -i '\bweblogic_' {} +
Run Code Online (Sandbox Code Playgroud)

{}表示输入文件名列表,并+指定应尽可能多地传递输入文件名 - 如同xargs.

最后,如果您的grep版本支持该-R选项,您可以find完全放弃,只需让grep以递归方式处理所有文件:

 grep -R -i '\bweblogic_' .
Run Code Online (Sandbox Code Playgroud)