如何在 Linux 上使用 grep 命令如何在 Linux 上使用 grep 命令如何在 Linux 上使用 grep 命令如何在 Linux 上使用 grep 命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用 grep 命令

Linux grep 命令是一个字符串和模式匹配实用程序,可显示来自多个文件的匹配行。它还适用于其他命令的管道输出。我们告诉你如何。

grep 背后的故事

grep 命令之所以在 Linux 和 Unix 圈子里出名,有以下三个原因。首先,它非常有用。其次,丰富的选择可能是压倒性的。第三,它是为了满足特定需求而在一夜之间写成的。前两个很成功;第三个稍微关闭。

Ken Thompson 从 ed 编辑器(发音为 ee-dee)中提取了正则表达式搜索功能,并创建了一个小程序——供他自己使用——来搜索文本文件。他在贝尔实验室的部门负责人道格麦克罗伊找到汤普森,并描述了他的一位同事李麦克马洪所面临的问题。

麦克马洪试图通过文本分析来确定联邦党人论文的作者。他需要一种可以在文本文件中搜索短语和字符串的工具。 Thompson 那天晚上花了大约一个小时使他的工具成为可供其他人使用的通用实用程序,并将其重命名为 grep。他从 ed 命令字符串 g/re/p 中取名,翻译为“全局正则表达式搜索”。

您可以观看 Thompson 与 Brian Kernighan 谈论 grep 的诞生。

使用 grep 进行简单搜索

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

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

alias grep='grep --colour=auto'

让我们看看有多行匹配的结果。我们将在应用程序日志文件中查找“Average”一词。因为我们不记得这个词在日志文件中是否是小写的,所以我们将使用 -i (忽略大小写)选项:

grep -i Average geek-1.log

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

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

grep -v Mem geek-1.log

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

我们可以使 grep 完全静音。结果作为 grep 的返回值传递给 shell。结果为零表示找到了字符串,结果为一表示没有找到。我们可以使用 $? 特殊参数检查返回码:

grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

使用 grep 进行递归搜索

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

grep -r -i memfree .

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

我们可以使用 -R(递归取消引用)选项使 grep 跟随符号链接。我们在这个目录中有一个符号链接,称为 logs-folder。它指向 /home/dave/logs。

ls -l logs-folder

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

grep -R -i memfree .

紧随其后的是符号链接,它指向的目录也由 grep 搜索。

搜索整个单词

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

grep -i free geek-1.log

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

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

grep -w -i free geek-1.log
echo $?

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

使用多个搜索词

-E(扩展正则表达式)选项允许您搜索多个词。 (-E 选项替换了已弃用的 egrep 版本的 grep。)

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

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

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

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

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

两个字符串都匹配,事实上,有些行包含两个字符串。

精确匹配线

-x(行正则表达式)将仅匹配整行与搜索词匹配的行。让我们搜索一个我们知道在日志文件中只出现一次的日期和时间戳:

grep -x "20-Jan--06 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 average geek-1.log

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

您可以使用 -n(行号)选项让 grep 显示每个匹配行的行号。

grep -n Jan geek-1.log

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

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

grep -m5 -n Jan geek-1.log

添加上下文

能够为每个匹配行看到一些额外的行——可能是非匹配行——通常很有用。它可以帮助区分哪些匹配的行是您感兴趣的行。

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

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

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

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

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

grep -C 3 -x "20-Jan-06 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”。我们知道会有很多,所以我们将输出通过管道传输到 less 中:

grep "ExtractParameters" *.c | less

输出以 less 形式呈现。

这使您可以翻阅文件列表并使用 lesss 搜索工具。

如果我们将 grep 的输出通过管道传输到 wc 并使用 -l (行数)选项,我们可以计算源代码中的行数包含“ExtractParameters”的代码文件。 (我们可以使用 grep -c (count) 选项来实现这一点,但这是演示 grep 管道输出的一种巧妙方法。)

grep "ExtractParameters" *.c | wc -l

使用下一个命令,我们将 ls 的输出传输到 grep 并将 grep 的输出传输到 sort 。我们列出当前目录中的文件,选择其中包含字符串“Aug”的文件,并按文件大小对它们进行排序:

ls -l | grep "Aug" | sort +4n

让我们分解一下:

  • ls -l:使用 ls 执行文件的长格式列表。
  • grep “Aug”:从 ls 列表中选择包含“Aug”的行。请注意,这还会查找名称中包含“Aug”的文件。
  • sort +4n:在第四列(文件大小)对 grep 的输出进行排序。

我们得到了 8 月(无论年份)修改的所有文件的排序列表,按文件大小的升序排列。

grep:少一个命令,多一个盟友

grep 是一个非常棒的工具供您使用。它的历史可以追溯到 1974 年,并且仍然很强大,因为我们需要它的功能,而且没有什么比它更好的了。

将 grep 与一些正则表达式结合起来-fu 确实将它提升到了一个新的水平。

Linux Commands
Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc
Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap
Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

RELATED: Best Linux Laptops for Developers and Enthusiasts

©2015-2025 艾丽卡 support@alaica.com