如何在 UNIX/Linux 下按内容查找文件
在Unix或Linux操作系统下,您需要使用以下工具按内容查找文件:
- grep command:打印与模式匹配的行。
- find command:在目录层次结构中搜索文件。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 搜索 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 5 分钟 |
在 Unix 或 Linux 上使用grep 命令按内容查找文件
grep 命令是Linux 和 Unix 中的文本搜索实用程序,可用于查找与特定模式匹配的文本行。语法如下:
grep 'string' *.txt # The -r option passed to the grep to search recursively in dir/folder# grep -r "word" /path/to/dir1/ grep 'main(' *.c grep '#include<example.h>' *.c grep 'getChar*' *.c # The i option tells grep to to ignore case distinctions # grep -i 'ultra' *.conf grep -iR 'ultra' *.conf
其中 grep 选项为:
- -i :忽略 PATTERN(匹配有效、VALID、ValID 字符串)和输入文件(数学文件.c FILE.c FILE.C 文件名)中的大小写区别。
- -R(或-r):递归读取每个目录下的所有文件。
你也可以使用egrep 命令。例如,在所有 conf 文件 ( *.conf ) 中查找名为 'foo' 和 'bar' 的两个单词:
$ grep -E 'foo|bar' *.conf
使用 shell 管道按内容查找文件
grep 命令和egrep 命令均适用于文件或 stdin 或 shell 管道提供的输入。例如,运行 ls 命令并使用以下语法搜索 resume.doc 和 wife-birthday-party.png:
$ ls -l | egrep 'resume.doc|wife-birthday-party.png'
$ ls -l | grep -i -E 'resume.doc|wife-birthday-party.png'
突出显示搜索到的模式
--color您可以通过传递以下选项来在搜索大量文件时轻松突出显示模式:
$ grep --color=auto -iR 'getChar();' *.c
显示搜索模式的文件名和行号
您可能还需要显示文件名和数字,因此传递选项-H:
$ grep --color=auto -iRnH 'getChar();' *.c
其中,
- -n:在输入文件中,为每行输出加上以 1 为基数的行号作为前缀。
- -H打印每个匹配的文件名。当要搜索的文件不止一个时,这是默认设置。
接下来,输入以下命令:
$ grep --color=auto -nH 'WORD_HERE' *
$ grep --color=auto -nH 'DIR' *
图 01:grep 命令显示搜索到的模式
$ fgrep --color=auto -iRnH '192.168.2' /etc/ 2>/dev/null
$ grep --color=auto -iRnHf '192.168.2' /etc/ 2>/dev/null
fgrep 或-f传递给 grep 的选项将 PATTERNS 解释为固定字符串,而不是正则表达式 (regex)。用于通过将 stderr 发送到 /dev/null 来2>/dev/null隐藏权限错误消息。
使用 find 命令按单词或字符串搜索文件
Linux 或 Unix 中的 find 命令充当文件搜索实用程序。它可用于根据各种条件(包括文件内容)查找文件。要查找包含特定字符串的所有文件,请使用以下语法:
另一个选项是使用 find 在 UNIX/Linux 下按内容查找文件,如下所示:传递给 find 的
-type f选项仅搜索常规文件。传递给 find 命令的-exec grep -q "string" {} \;告诉 find 命令对找到的每个文件运行grep 命令,传递给 find 命令的-print显示 grep 在 CLI 中找到的每个文件的名称。例如,在 /etc/ 目录中查找名为“192.168.2.254”的 IP 地址字符串:
输出:
$ find /dir/to/search/ -name "file-pattern" -print | xargs grep "word-to-search"
## OR ##
$ find /dir/to/search -iname "file-pattern" -print0 | xargs -I {} -0 grep "string-to-search" "{}"
$ find /path/to/dir/ -type f -exec grep -q "string" {} \; -print
$ sudo find /etc/ -type f -exec grep -q "192.168.2.254" {} \; -print
[sudo] password for vivek: /etc/hosts /etc/resolv.conf
本例搜索所有 c 程序文件 (*.c),查找“ main(”函数,在当前目录中匹配时将其打印在屏幕上。输入:
$ find . -name "*.c" -print | xargs grep "main("
OR
$ find /projects/ -iname "*.c" -print0 | xargs -I {} -0 grep "main(" "{}"
其中 find 命令选项为:
- -name:文件名的基数。例如,查找所有 Perl 文件 ( *.pl)
- -iname:同上(-name
- -print:在标准输出上打印完整的文件名。
- -print0:在标准输出上显示完整文件名,后跟一个空字符(而不是使用的换行符-print)。这允许处理 find 输出的程序正确解释包含换行符或其他类型空格的文件名。此选项对应于-0xargs 的选项。
并且,xargs 命令是:
- -I {}:将{}初始参数中的出现替换为从标准输入读取的名称。换句话说,将其{}作为输入传递给 grep 命令。
- -0:输入项以空字符而不是空格结尾,引号和反斜杠不是特殊字符(每个字符都按字面意思理解)。禁用文件结尾字符串,该字符串将像其他任何参数一样处理。当输入项可能包含空格、引号或反斜杠时很有用。GNU find -print0 选项可生成适合此模式的输入。
- grep "main(" "{}"main(:在 find 命令找到的文件中,使用 grep搜索“ ”字符串。
结论
您学习了如何在 UNIX 和 Linux 下使用各种命令按内容查找文件。请参阅以下资源:
- grep 命令和egrep 命令
- 请使用 man 命令或 help 命令阅读手册页(或在此处阅读 GNU grep 帮助页):
$ man grep
$ man find
$ man grep
$ grep --help - 查找命令