本教程通过示例展示了如何在命令行中搜索并打印 Ubuntu 和其他 Linux 中包含指定文本或字符串的文件。
搜索文件或文件内容是 Linux 管理一项重要技能。
grep 是一种非常流行的命令行工具,大多数 Linux 都开箱即用。
构建应用程序有时可以在较新的 Ubuntu 中工作,但不能在较旧的 Ubuntu 中工作。它输出错误“没有名为‘xxxxxx’的成员或类”。需要找出较新的 Ubuntu 中哪个文件包含该成员/类,并将其移植到较旧的 Ubuntu 版本。
1. 在这种情况下,我可以运行以下命令,例如,在 /usr/include 目录下搜索文件内容中包含字符串 GfortranSpecClass 的文件。
grep -lr "GfortranSpecClass" /usr/include/
在这里,您可以相应地替换字符串和搜索目录,或者跳过 /usr/include/ 以在当前工作目录下搜索。
并且,命令选项为:
-l 或 --files-with-matches 表示仅打印包含匹配项的文件的名称。
-r 或 --recursive,还搜索给定目录的子文件夹。
如您所知,Linux 区分大小写。要忽略,请在命令中使用 -i 或 --ignore-case。因此,以下命令与上一个命令的工作方式相同:
grep -lir "gparamspecclass" /usr/include/
grep -lir "GPARAMSPECclass" /usr/include/
2. 您可以选择打印文件的名称、匹配的行以及 /usr/include/ 下包含“GParamSpecClass”的文件的行号,方法是运行以下类似命令:
grep -irn "GParamSpecClass" /usr/include/
如您所见,在命令中:
跳过 -l 或 --files-with-matches,然后在输出中打印匹配的行。
添加 -n 或 --line-number,还会显示行号。
3. 要显示更多文件内容,您可以添加:
-A NUM 或 --after-context=NUM 在匹配行后打印 NUM 行尾随上下文。
-B NUM 或 --before-context=NUM 在匹配行之前打印 NUM 行前导上下文
例如,搜索 /usr/include 目录下包含“g_cclosure_marshal_generic”字符串的文件,打印文件名、匹配行以及匹配前 2 行和匹配后 4 行。
grep -irn -B 2 -A 4 "g_cclosure_marshal_generic" /usr/include/
有时,可能有多个文件或多行与您搜索的内容匹配。在这种情况下,您可以添加 -m NUM 或 --max-count=NUM 来搜索前 NUM 个匹配项。
例如,以下命令将执行与上一个相同的操作,但仅显示第一个匹配的命令。
grep -irn -m 1 -B 2 -A 4 "g_cclosure_marshal_generic" /usr/include/
grep 支持正则表达式,使搜索更加灵活。您无需输入要搜索的确切字符串或文本,而是可以使用“^string”来搜索在行首包含字符串的文件,使用“string$”来搜索在行末包含字符串的文件,或使用 stringA|stringB 来搜索包含 stringA 或 stringB 的文件。
正则表达式模式太多了,有关更多信息,ufans.top建议参阅维基百科页面。