使用grep命令时如何排除目录?
概述
我们经常运行grep命令来查找文件中的特定文本字符串。grep命令提供了一些附加功能,使搜索更加高效。其中一项功能允许您排除某些目录的递归搜索。这在搜索大量数据时非常有用。
Grep 可以与 -r 选项一起使用,该选项允许您指定多个模式,然后使用 -v 选项仅显示与您的模式匹配的文件。
我们将讨论实现此目标的不同方法。
排除单个目录
最简单的方法是将排除的目录名称添加到文件路径的末尾。例如:
grep -r 'pattern' /path/to/directory1/*
这将找到指定目录或任何子目录中的所有文件。但是,它不会排除任何内容。
要排除单个目录,您需要包含 -d 标记。因此,如果您要排除 /home 目录,可以使用:
grep -rd '/home' /path/to/*
我们将创建一些文件和文件夹作为示例。
$ mkdir tdir1 tdir2 tdir3 logs apache-logs $ echo "This is sample text from tdir1/file1.txt file" > tdir1/file1.txt $ echo "This is sample text from tdir2/file2.txt file" > tdir2/file2.txt $ echo "This is sample text from tdir3/file3.txt file" > tdir3/file3.txt $ echo "This is sample text from logs/service.log file" > logs/service.log $ echo "This is sample text from apache-logs/apache.log file" > apache-logs/apache.log
现在让我们看一下我们刚刚创建的目录树:
$ tree -h . . ├── [4.0K] tdir1 │ └── [ 45] file1.txt ├── [4.0K] tdir2 │ └── [ 45] file2.txt ├── [4.0K] tdir3 │ └── [ 45] file3.txt ├── [4.0K] logs │ └── [ 47] service.log └── [4.0K] apache-logs └── [ 51] apache.log
5个目录,5个文件
我们可以使用 grep 命令的 -exclude-dir 选项来排除目录:
$ grep -R "sample" --exclude-dir=tdir1 logs/service.log:This is sample text from logs/service.log file tdir3/file3.txt:This is sample text from tdir3/file3.txt file tdir2/file2.txt:This is sample text from tdir2/file2.txt file apache-logs/apache.log:This is sample text from apache-logs/apache.log file
在上面的示例中,grep 命令搜索除 tdir1 之外的所有目录中的模式。
排除多个目录
如果您想排除多个目录,可以使用管道字符 (|) 将它们组合成一个字符串。您也可以使用通配符。例如,假设您有两个要排除的目录:
您可以使用 * 或 ? 字符来表示单个字符。如果您要查找文字星号 (*),则应在其前面加上反斜杠进行转义。
您可以指定多个 -exclude-directories 选项来排除多个目录。
$ grep -R "sample" --exclude-dir=tdir1 --exclude-dir=tdir2 --exclude-dir=tdir3 logs/service.log:This is sample text from logs/service.log file apache-logs/apache.log:This is sample text from apache-logs/apache.log file
在上面的示例中,grep 命令搜索除 *tdir1*、*tdir2* 和 *tdir3* 之外的所有目录中的模式。
您可以使用另一种语法来达到相同的结果。我们可以在花括号中提供目录列表。
$ grep -R "sample" --exclude-dir={tdir1,tdir2,tdir3} logs/service.log:This is sample text from logs/service.log file apache-logs/apache.log:This is sample text from apache-logs/apache.log file
请注意,逗号前后不应有空格。
使用模式匹配排除目录
如果我们要一次排除很多目录,我们通常可以使用正则表达式来匹配它们。grep 命令支持使用 *通配符* 字符通过正则表达式匹配来排除目录。
? 用于匹配前面字符的零次或一次出现
* 用于匹配前面字符的零次或多次出现
\ 用于转义通配符
让我们使用模式 tdir? 来排除 tdir1、tdir2 和 tdir3 目录:
$ grep -R "sample" --exclude-dir=tdir? logs/service.log:This is sample text from logs/service.log file apache-logs/apache.log:This is sample text from apache-logs/apache.log file
让我们使用 logs\* 和 \*logs 模式来排除名称以 logs 开头或结尾的目录:
$ grep -R "sample" --exclude-dir={logs\*,\*logs} tdir1/file1.txt:This is sample text from tdir1/file1.txt file tdir3/file3.txt:This is sample text from tdir3/file3.txt file tdir2/file2.txt:This is sample text from tdir2/file2.txt file
结论
我们讨论了三种在递归遍历文件系统时排除目录的实用方法。这些命令可以在日常使用 Linux 系统时派上用场。