如何在Linux上使用grep命令

的Linux grep command是一个字符串和模式匹配实用程序,用于显示多个文件中的匹配行。它也可以与其他命令的管道输出一起使用。我们向您展示如何。

grep背后的故事

grep 该命令在Linux和Unix界很出名,原因有三点。首先,它非常有用。其次,选择的丰富性可能是压倒性的。第三,为了满足特殊需要,它是一夜之间编写的。前两个爆炸了。第三是稍微关闭。

肯·汤普森(Ken Thompson)从 编辑器(发音为ee-dee),并创建了一个供自己使用的小程序来搜索文本文件。他在贝尔实验室的部门负责人Doug Mcilroy与Thompson接触,并描述了他的一位同事Lee McMahon所面临的问题。

麦克马洪试图通过文本分析来识别联邦主义者论文的作者。他需要一个可以在文本文件中搜索短语和字符串的工具。汤普森那天晚上花了大约一个小时的时间,将他的工具变成了可供他人使用的通用工具,并将其更名为 grep。他从 命令字串 克/重/ p ,翻译为“全局正则表达式搜索”。

您可以观看汤普森(Thompson)与布莱恩·克尼根(Brian Kernighan)谈论 grep.

使用grep进行简单搜索

要在文件中搜索字符串,请在命令行中传递搜索词和文件名:

显示匹配行。在这种情况下,它是一行。匹配的文本突出显示。这是因为在大多数发行版中 grep 别名为:

别名grep =“ grep --colour = auto”

让我们看一下有多行匹配的结果。我们将在应用程序日志文件中查找“ Average”一词。由于我们无法回忆起日志文件中的单词是否为小写字母,因此我们将使用 -一世 (忽略大小写)选项:

grep -i平均geek-1.log

将显示每条匹配的行,并在每行中突出显示匹配的文本。

我们可以使用-v(反转匹配)选项来显示不匹配的行。

grep -v Mem geek-1.log

没有突出显示,因为这些是不匹配的行。

我们可以导致 grep 保持沉默。结果作为返回值从外壳传递到外壳 grep。结果为零表示字符串 曾是 找到,结果为“ 1”表示 不是 成立。我们可以使用 $? 特殊参数:

grep -q average geek-1.log
回声$?
grep -q howtogeek geek-1.log
回声$?

使用grep进行递归搜索

要搜索嵌套目录和子目录,请使用-r(递归)选项。请注意,您没有在命令行上提供文件名,而必须提供路径。我们在这里搜索当前目录“。”以及任何子目录:

grep -r -i memfree。

输出包括每个匹配行的目录和文件名。

我们可以做grep 通过使用以下符号链接 -R (递归取消引用)选项。我们在此目录中有一个符号链接,称为 原木文件夹。它指向 / home / dave / logs.

ls -l日志文件夹

让我们重复上一次的搜索-R (递归取消引用)选项:

grep -R -i memfree。

跟随符号链接,并搜索指向的目录 grep 也。

搜索全词

默认, grep 如果搜索目标出现在该行的任何位置(包括另一个字符串内),则将与该行匹配。看这个例子。我们将搜索“免费”一词。

grep -i免费geek-1.log

结果是其中包含字符串“ free”的行,但它们不是单独的单词。它们是字符串“ MemFree”的一部分。

强迫 grep 仅匹配单独的“单词”,请使用 -w (单词正则表达式)选项。

grep -w -i免费geek-1.log
回声$?

这次没有结果,因为搜索词“ free”没有在文件中单独出现。

使用多个搜索词

-E (扩展的regexp)选项可让您搜索多个单词。 (这 -E 选项替换不推荐使用的选项 egrep 版本 grep.)

该命令搜索两个搜索词“ average”和“ memfree”。

grep -E -w -i“ average | memfree” geek-1.log

将显示每个搜索词的所有匹配行。

您还可以搜索不一定是整个单词的多个术语,但也可以是整个单词。

-e (模式)选项可让您在命令行上使用多个搜索词。我们正在使用正则表达式括号功能来创建搜索模式。它说 grep 匹配括号“ []”中包含的任何字符。这表示 grep 搜索时将匹配“ kB”或“ KB”。

两个字符串都匹配,并且实际上,某些行包含两个字符串。

精确匹配线

-X (第regexp行)将仅匹配以下行 整条线 匹配搜索词。让我们搜索一个我们知道在日志文件中仅出现一次的日期和时间戳:

grep -x“ 06年1月20日15:24:35” geek-1.log

找到并显示匹配的单行。

相反的是只显示 比赛。当您查看配置文件时,这很有用。评论很棒,但是有时候很难在其中找到实际设置。这是 / etc / sudoers 文件:

我们可以像这样有效地过滤掉注释行:

sudo grep -v“#” / etc / sudoers

这很容易解析。

仅显示匹配文本

有时候您可能不想只看到整个匹配行,而只看到匹配文本。这 -o (仅匹配)选项可以做到这一点。

grep -o MemFree geek-1.log

显示减少为仅显示与搜索词匹配的文本,而不是整个匹配行。

用grep计数

grep 不只是文字,它还可以提供数字信息。我们可以做 grep 以不同的方式为我们计数。如果我们想知道一个搜索词在文件中出现多少次,可以使用 -C (计数)选项。

grep -c平均geek-1.log

grep 报告搜索字词在此文件中出现240次。

你(们)能做到 grep 使用来显示每个匹配行的行号 -n (行号)选项。

grep -n Jan geek-1.log

每条匹配行的行号显示在该行的开头。

要减少显示的结果数,请使用 -米 (最大计数)选项。我们将输出限制为五个匹配行:

grep -m5 -n Jan geek-1.log

添加上下文

能够看到每个匹配行的其他一些行(可能是不匹配的行)通常很有用。它可以帮助您区分哪些匹配的行是您感兴趣的行。

要在匹配的行之后显示一些行,请使用-A(在上下文之后)选项。在此示例中,我们要求输入三行:

grep -A 3 -x“ 06年1月20日15:24:35” geek-1.log

要查看匹配行之前的一些行,请使用 -B (在上下文之前)选项。

grep -B 3 -x“ 06年1月20日15:24:35” geek-1.log

要包含匹配行之前和之后的行,请使用 -C (上下文)选项。

grep -C 3 -x“ 06年1月20日15:24:35” geek-1.log

显示匹配文件

要查看包含搜索词的文件的名称,请使用 -l (具有匹配项的文件)选项。要找出哪些C源代码文件包含对 sl.h 头文件,请使用以下命令:

grep -l“ sl.h” * .c

列出了文件名,而不是匹配的行。

当然,我们可以查找不包含搜索词的文件。这 -L (不匹配的文件)选项就是这样做的。

grep -L“ sl.h” * .c

行的开始和结束

我们可以强迫 grep 只显示行首或行尾的匹配项。正则表达式运算符“ ^”匹配行的开头。实际上,日志文件中的所有行都会包含空格,但是我们将搜索以空格作为第一个字符的行:

grep“ ^” geek-1.log

显示以空格作为第一个字符的行(在该行的开头)。

要匹配行尾,请使用“ $”正则表达式运算符。我们将搜索以“ 00”结尾的行。

grep“ 00 $” geek-1.log

显示屏显示以“ 00”作为最后字符的行。

在grep中使用管道

当然,您可以通过管道将输入 grep ,通过管道传递来自 grep 进入另一个程序,并拥有 grep 坐落在管道链的中间。

假设我们要查看C源代码文件中所有出现的字符串“ ExtractParameters”。我们知道将会有很多,所以我们将输出传送到 较少的:

grep“ ExtractParameters” * .c |较少的

输出显示在 较少的.

这使您可以浏览文件列表并使用 较少的 搜索工具。

如果我们通过管道输出 grep 进入 厕所 并使用 -l (行)选项,我们可以计算包含“ ExtractParameters”的源代码文件中的行数。 (我们可以使用 grep-C (count)选项,但这是演示管道输出的一种简洁方法 grep.)

grep“ ExtractParameters” * .c | wc -l

使用下一条命令,我们将管道输出 ls 进入 grep 并用管道输送来自 grep 进入 种类 。我们将列出当前目录中的文件,选择其中包含字符串“ Aug”的文件,然后按文件大小对其进行排序:

ls -l | grep“ Aug” |排序+ 4n

让我们来分解一下:

  • ls -l:使用以下命令列出文件的长格式 ls.
  • grep“八月”:从中选择行 ls 列出其中包含“ Aug”的列表。请注意,这还将查找名称中带有“ Aug”的文件。
  • 排序+ 4n:在第四列(文件大小)上对grep的输出进行排序。

我们获得了按文件大小的升序排序的所有文件的排序列表,这些文件在8月(不考虑年份)中进行了修改。

有关的:如何在Linux上使用管道

grep:更少的命令,更多的盟友

grep 是一个很棒的工具供您使用。它的历史可以追溯到1974年,但由于我们需要它所做的一切,而它却没有更好的表现,因此它仍然很强大。

耦合 grep 使用一些正则表达式,fu确实将它带入了一个新的高度。

有关的:如何使用基本正则表达式更好地搜索并节省时间


$config[zx-auto] not found$config[zx-overlay] not found