如何在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确实将它带入了一个新的高度。
有关的:如何使用基本正则表达式更好地搜索并节省时间