【问题标题】:grep ending with wildcard find results that are not suitable以通配符结尾的 grep 查找不合适的结果
【发布时间】:2021-06-30 15:56:58
【问题描述】:

我想查找所有以“libc”开头的文件。 例如,这些是我拥有的文件:

root@956b8809ab66:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Apr  4 14:14 ./
drwxr-xr-x 1 root root 4096 Apr  4 14:14 ../
-rw-r--r-- 1 root root    0 Apr  4 14:14 libc
-rw-r--r-- 1 root root    0 Apr  4 14:14 libd
-rw-r--r-- 1 root root    0 Apr  4 14:14 libe

所以我使用了这个命令:

find .  -type f  | grep  "libc*"

例如,我得到了不以“libc”开头的文件:

root@956b8809ab66:/test# find .  -type f  | grep  "libc*"
./libd
./libe
./libc

不适合正则表达式中*的含义,也不适合glob构造。

那么为什么grep 会返回这些结果呢?

【问题讨论】:

标签: linux grep find


【解决方案1】:

正如@Janez Kuhar 指出的libc* 被视为正则表达式。它将与regex demo中所示的所有内容匹配


如果您希望 find 仅将 libc* 显示为 glob,我建议使用 -iname

find . -type f -iname "libc*"

作为OP's comment的补充:

那么这是否意味着“libc*”和“liba*”或“libf*”之间没有区别?

* 正则表达式量词指出:

零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪婪)

所以是的,libc*liba*libf* 都会给出相同的结果,因为您仍然说最后一个字符 (a/f) 是可选的,因此 lib 将匹配.

【讨论】:

  • 谢谢,非常有帮助。那么这是否意味着“libc*”和“liba*”或“libf*”之间没有区别?所有这些选项都将返回相同的结果
  • 谢谢。我觉得奇怪的是,所有这些选项都会产生相同的结果。实际上“libc*”将返回与“lib.*”相同的结果。也许我们错过了什么。但现在我不知道是什么。再次感谢
  • 如果你问我,这并不奇怪。对于lib.*,请检查:this demo。您正在寻找lib,然后是任何字符 - 零次和无限次。所以这一切都会再次匹配。
【解决方案2】:

Tl;dr 版本:使用find . -type f -name 'libc*'

有几件事会给您带来一些困难;假设您的发现为您提供了以下(假设的)结果。

$ find . -type f
./meh/library/alfa.py
./meh/bravolib/bravo.rb
./meh/libcharlie/charlie.c
./meh/libs/libc.so
./meh/libs/libm.so
./meh/mike/mikeslibc.so

您的 `grep libc*' 将返回这些行中的每一行。那个 grep 本质上是说给你每一行都有 'lib' 后跟零个或多个 c。上面的每一行都符合这个标准。

如果你想挽救你的 grep,你可以做几件事:

  • 将 * 更改为 .*;有了这个而不是匹配零个或多个前一个字符,您将匹配零个或多个任何字符;句号代表任何字符。
  • 在 libc 之前检查 / ;这将过滤掉像'./mikeslibcs​​tuff.so'这样的东西
  • 而不是检查 anything 检查不包含正斜杠的任何内容;本质上是 [^/]* 而不是 .*。
  • 使用 $ 将模式锚定到字符串的末尾。
  • grep '/libc[^/]$ 可能会给你想要的结果。

现在;尽管如此,您实际上是在尝试将方形钉子放入圆孔中。在这种情况下,Grep 并不是真正适合这项工作的工具。正确的工具是使用带有 -name 或 -iname 标志的 find 内置的文件名通配符匹配功能:

$ find . -name 'libc*'

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多