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

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

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

find | grep 0000\:00\:*.0/usb1/authorized_default

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

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

find | grep 0000\:00\:*.0/usb*/authorized_default

预先感谢您的时间和回复。

答案1

grep用途常用表达, 不是壳球

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

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

同样,usb*/将匹配us/,usb/usbbb/,但不匹配usb1


实际上,还存在一个问题,即*参数中未加引号的部分被grep视为全局字符通过外壳grep甚至在看到它之前。因此,如果存在可以0000\:00\:*.0/usb*/authorized_default作为 glob 模式匹配的文件,则会影响转到grep.多个匹配将作为多个参数,并将grep第一个匹配之后的参数作为文件名。

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


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


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

答案2

正如 ilkkachu 已经指出的那样,grep使用基本正则表达式,这意味着:*匹配零个或多个:,并且b*匹配零个或多个b


不要grep输出find,而是使用find来查找您的文件。在一般情况下,文件名可能包含换行符,这将使 grep 不起作用。使用find直接过滤想要查看的路径名也更高效、更安全。

find . -type f -name 'authorized_default'

如果您必须对路径名的其他部分进行匹配:

find . -type f -path '*0000:00:*.0/usb*/authorized_default'

-path工作方式类似于-name但匹配整个路径的文件名通配模式,而不是仅匹配路径名的文件名部分( a*可以匹配一个或多个/)。

有关的:

相关内容