Linux 中的 grep 命令示例
Grep 是一个有用的命令,可帮助您快速搜索和查找文件内容。
“Linux 中的一切都是文件”,这就是大多数 Linux 用户花费大量时间修改文件内容的原因。
这就是 grep 命令发挥关键作用的地方,它可以让您在文本文件中搜索和匹配模式或获取输出。
因此,在本教程中,我将引导您了解学习 grep 命令所需的所有要点:
命令的基本语法和流行标志
命令的实际示例
grep 命令练习题
以下是如何使用 grep 命令
要使用 grep 命令,了解语法很重要。
这是 grep 命令的基本语法:
grep [OPTIONS] PATTERN <Filename>
这里,
[OPTIONS]
:使用给定的选项集,您可以更改 grep 命令的默认行为,例如使用-i
启用不区分大小写的搜索。PATTERN
:您可以在此处指定要从文件或命令输出中查找的文本。它也可以是更复杂模式的正则表达式。
:在这里您指定要在其中搜索的文件,如果您没有指定任何文件,那么它将从标准输入中搜索。
现在,让我们看一下 grep 命令的一些常用选项:
-i
搜索时忽略大小写。
-v
打印与模式不匹配的行。
-n
显示每个匹配行的行号。
-w
仅匹配整个单词,而不匹配单词的一部分。
-c
计算匹配行的数量,不打印行。
-r
递归地搜索目录。
-A n
在每个匹配行之后打印 n 行。
-B n
在每个匹配行之前打印 n 行。
-C n
在每个匹配行之前和之后打印 n 行。
-f Filename
从文件中读取搜索模式,每行一个。
-o
仅打印该行的匹配部分。
您可能想知道 - 当您使用不带任何选项的 grep 命令时会发生什么?嗯,它只是打印包含该模式的行。
例如,在这里,我想在名为 error.log
的文件中搜索 error
关键字,并且在没有任何其他选项的情况下,它给出了以下输出:
你看到了吗?它会突出显示找到的模式并打印包含该模式的行。
为了使本教程易于理解,我将使用名为 error.log
的示例文件,其中包含以下行:
This is a log file with various messages.
An error occurred at 10:00 AM.
The system encountered an unexpected issue.
Everything is working normally now.
Another error message at 11:30 AM.
Warning: Please check disk usage.
Log closed at 12:00 PM
grep命令的实际例子
在本节中,我将介绍 grep 命令的各种示例,以便您可以更好地了解如何使用 grep 命令。
1. 不区分大小写的搜索
默认情况下,grep 命令模式区分大小写,并且在大多数情况下,它运行良好,但您可能希望关闭区分大小写。
为此,您可以使用 -i
标志,如下所示:
grep -i PATTERN Filename
为了演示这一点,我将使用 ERROR
作为搜索模式,它将显示匹配模式,而不考虑大小写:
grep -i ERROR error.log
2. 在匹配行的前后显示n
行
默认情况下,grep 命令仅打印匹配行,但有时您需要匹配行的上下文。因此,您打印匹配行之前和之后的行。
在匹配行之前打印 n
行
要在匹配行之前打印 n 行,请使用 -B
标志并指定要打印的行数,如下所示:
grep -B <number_of_lines> PATTERN Filename
例如,在这里,我在每个匹配行之前打印一行:
grep -B 1 error error.log
在匹配行之后打印 n
行
要打印匹配行后的 n 行,请使用 -A
标志并指定行数,如下所示:
grep -A <number_of_lines> PATTERN Filename
如果我想在匹配行之后打印一行,那么我将使用以下内容:
grep -A 1 error error.log
在匹配行之前和之后打印 n
行
如果您想同时打印之前和之后的行,则可以使用 -C
标志并指定要打印的行数,如下所示:
grep -C <number_of_lines> PATTERN Filename
假设我想在匹配的模式行之前显示 1 行,在匹配模式行之后显示 1 行,那么我将使用以下内容:
grep -C 1 error error.log
3. 显示与模式不匹配的线条
大多数情况下,您将使用 grep 命令来匹配模式,但它也允许您反转搜索结果。
简而言之,您指定搜索词,它将打印与给定模式不匹配的行,为此,您可以使用 -v
标志,如下所示:
grep -v PATTERN Filename
例如,如果我想打印不包含 error
术语的每一行,那么我将使用以下内容:
grep -v error error.log
4.显示匹配行数
要显示匹配行数,您所要做的就是使用 -n
标志,如下所示:
grep -n PATTERN Filename
5、显示匹配结果总数
如果您想知道匹配结果的数量,则可以使用 -c
标志,如下所示:
grep -c PATTERN Filename
例如,在这里,我想查找 error.log
文件中提到术语 error
的次数,因此我使用了以下命令:
grep -c error error.log
6. 在多个文件中搜索模式
如果您希望从多个文件中搜索模式,那么您所要做的就是附加多个文件进行搜索,如下所示:
grep PATTERN File1 File2
例如,在这里,我从两个文件中搜索了 error
字符串:error.log
和 error.txt
,它给出了以下输出:
grep error error.log error.txt
7. 从目录中的每个文件中搜索模式
如果您想从目录中存在的每个文件中搜索特定模式,则可以递归地使用 grep 命令,它将从该特定目录中存在的每个文件中搜索给定模式。
要启用递归搜索,请使用 -r
标志,如下所示:
grep -r PATTERN <Directory or path to directory>
例如,在这里,我在当前目录中搜索了 error
字符串:
grep -r error .
8. 搜索确切的单词
默认情况下,grep 命令将打印所有匹配的模式,这不是您总是想要的。听起来很奇怪?请允许我解释一下。
假设您要搜索术语 Orange
,但如果特定文件还包含术语 Oranges
,则包含术语 Oranges
的行也将是显示为输出。
要解决此问题,您可以使用 -w
选项并指定模式:
grep -w PATTERN Filename
例如,在这里,我打算查找术语 err
,因此我将使用 -w
标志,并且还将向您展示当您不使用时发生的情况之间的差异它。
grep -w err error.log
当我使用 -w
标志查找 err
字符串时,它没有返回任何结果,因为它不存在。
但在第二次尝试中,我删除了 -w
标志,它返回了两个显示内容的结果,其中字符串模式是另一个字符串的一部分(不是单独的)。
9. 使用正则表达式模式进行高级搜索
如果普通搜索不能正常执行,那么您可以使用正则表达式模式(字符序列)来更好地控制您的搜索。您可以使用 -e
标志来使用正则表达式模式,而 -E
让您使用扩展的正则表达式:
grep -e/-E PATTERN Filename
例如,在这里我使用扩展的正则表达式来查找文件中一起使用的两个元音:
grep -e '[aeiouAEIOU]{2}' error.log
建议阅读?
10. 使用 OR 运算符指定多个模式
您可以使用 OR 运算符指定多个模式,这在您想要高效搜索多个模式时非常有用。
要指定多个模式,请按以下方式使用 OR 运算符 (|):
grep 'PATTERN_1\|PATTERN_2' Filename
假设我希望寻找两种模式:error
和 Please
那么我将使用以下内容:
grep 'error\|Please' error.log
练习题?
练习是最好的学习方式,这就是为什么我要分享一些 grep 命令的练习问题。
您可以使用我在本指南开头提到的 error.log
文件来解决以下问题:
从工作目录中存在的每个文件中查找
error
字符串。查找不包含术语
success
的行。搜索文件中包含
error
或issue
的行。通过禁用区分大小写的搜索并将输出重定向到文件来查找术语
log
。如何只打印最后 2 个结果而忽略其他所有结果? (提示:使用tail命令)
如果您发现解决上述问题有任何困难,请通过评论与我们联系或在我们的社区论坛中发布您的疑问。
您可以下载 grep 命令备忘单以获取更多示例和信息:
您是高级用户吗?尝试 ripgrep
ripgrep 命令可以执行 grep 命令执行的所有操作,但还具有一些额外的优点,例如性能和功能,包括在 zip 文件中进行搜索的能力。
听起来很酷吗?以下是在 Linux 中安装和使用 ripgrep 的方法:
此外,如果您是 Linux 新手,我建议您也阅读我们的初学者命令教程。
?分享您对该命令的想法、使用该命令的经验,以及您更喜欢用什么来替代 grep?