在 grep 命令中使用多个 * 的问题

Jam*_*ane 0 grep find

有谁知道为什么在 grep 命令中使用两个 * 不会返回任何内容。我原来的命令如下:

find | grep 0000\:00\:*.0/usb1/authorized_default
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我试图返回一个我不知道 PCI 文件夹名称的文件。此命令按预期完美运行(将 * 作为通配符)并确定 usb1 位于“1a”文件夹中。

如果我在命令中放置另一个通配符以将 'usb1' 替换为 'usb*',为什么 grep 不返回任何结果?我的最终目标是返回所有的authorized_default 文件,我意识到可以通过其他方式并且可能更有效地完成这些文件。然后我的问题就不是我该怎么做,但是当我将另一个“*”符号放入等式时,为什么 grep 不返回结果?

find | grep 0000\:00\:*.0/usb*/authorized_default
Run Code Online (Sandbox Code Playgroud)

提前感谢您的时间和回复。

ilk*_*chu 6

grep使用正则表达式,而不是shell globs

正则表达式0000:00:*.0/usb1/authorized_default匹配字符串0000:00+ 零个或多个冒号 + 任何字符 + 0/usb1/authorized_default

如果交换*.,它将匹配包含0000:00后跟 的 任何字符串0/usb1/authorized_default。(.*匹配任意数字 ( *) 的任意字符 ( .)。)

同样,usb*/将匹配us/usb/usbbb/等,但没有usb1


实际上,还有一个问题是,*在 to 参数中未引用的grep内容被shell视为全局字符,grep甚至在看到它之前。因此,如果存在匹配0000\:00\:*.0/usb*/authorized_default为 glob 模式的文件,则会影响到grep. 多个匹配将作为多个参数,并将grep第一个作为文件名。

在命令行上的任何正则表达式周围加上引号以防止这种情况发生。


无论如何grep,正如@Kusalananda 所说,您甚至不需要这里。该 -name给的选项find可以用来匹配的glob模式的文件名。至少某些find实现还可以-regex选择将文件名与正则表达式进行匹配。


还有许多正则表达式的变体,请参阅:为什么我的正则表达式在 X 中有效但在 Y 中无效?