你是否曾经面对过在文件中查找特定字符串或模式的任务,却不知道从哪里开始查找?那么,这里就是grep 命令出场拯救你!
grep是一个强大的文件模式搜索工具,它在每个Linux发行版上都预装了。如果由于某种原因,它没有安装在你的系统上,你可以按照下面的方式通过包管理器轻松安装它。
$ sudo apt install grep [On Debian, Ubuntu and Mint] $ sudo yum install grep [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-apps/grep [On Gentoo Linux] $ sudo apk add grep [On Alpine Linux] $ sudo pacman -S grep [On Arch Linux] $ sudo zypper install grep [On OpenSUSE]
I have found that the easiest way to get your feet wet with the grep command is to just dive right in and use some real-world examples.
1. 在 Linux 中搜索和查找文件
假设你刚刚在你的机器上安装了全新的 Ubuntu,并且你打算尝试Python脚本编程。
你一直在网络上搜索教程,但你发现有两个不同版本的Python在使用中,而你不知道 Ubuntu 安装程序安装了哪个版本的Python,或者是否安装了任何模块。
只需运行以下带有dpkg 命令和grep的命令,如下所示:
dpkg -l | grep -i python

首先,我们运行了dpkg –l
,它列出了系统上安装的*.deb
软件包。其次,我们将该输出导入到grep -i python
,这简单地表示“转到 grep 并过滤并返回所有包含“python”的内容。”
选项-i
用于忽略大小写,因为grep区分大小写。使用-i
选项是一个好习惯,除非你正在试图锁定更具体的搜索。
2. 在Linux中搜索和过滤文件
grep也可用于在单个文件或多个文件中搜索和过滤。让我们来看看这种情况:
你在使用你的Apache Web 服务器时遇到了一些问题,并且你已经在网络上的许多很棒的论坛上寻求帮助。
回答你的善良的人已经要求你发布/etc/apache2/apache2.conf文件的内容。如果你能够删除所有被注释的行,这样你、帮助你的人以及所有阅读它的人都会更容易,那不是更好吗?那么,你可以这样做!只需运行:
grep -v ^\# /etc/apache2/apache2.conf | grep .
选项-v
告诉grep反转其输出,这意味着它不再打印匹配的行,相反地打印所有不匹配表达式的行,在这种情况下,是#
注释行。
请注意,我们还在末尾使用了grep .
以隐藏所有空行的输出。这样我们在终端中只会看到配置设置。

3. 在Linux中找到所有.mp3文件
grep在过滤stdout时非常有用。例如,假设你有一个包含各种格式音乐文件的整个文件夹。
你想找出所有来自艺术家JayZ的*.mp3
文件,但不想要任何混音曲目。使用带有几个find命令的grep管道可以解决问题:
# find . -name “*.mp3” | grep –i JayZ | grep –vi “remix”
在这个例子中,我们使用find来打印所有扩展名为*.mp3
的文件,将其传输到grep –i
以过滤出并打印出所有文件名为“JayZ”的文件,然后再传输到grep –vi
,过滤出并不打印出任何带有字符串(任何情况下)“remix”的文件名。
[你可能也喜欢:Linux查找命令的35个实用示例]
4. 显示匹配字符串之前或之后的行数
另外两个选项是-A
和-B
开关,它们显示匹配行以及匹配字符串之前或之后的行数。
虽然 man 手册提供了更详细的解释,但我觉得最容易记住的选项是 -A
= after,以及 -B
= before:
ifconfig | grep -A 4 inet ifconfig | grep -B 2 UP

5. 打印匹配周围的行数
grep 的 -C
选项类似,但不是打印字符串之前或之后的行,而是按照指定的方向打印行:
# ifconfig | grep -C 2 lo TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 15314 bytes 1593769 (1.5 MB) RX errors 0 dropped 0 overruns 0 frame 0
6. 计算匹配次数
类似于将 grep 字符串传递给单词计数(wc 命令)的管道,grep 的内置选项也可以为您执行相同的操作:
# ifconfig | grep -c inet6
7. 在 Linux 中通过给定字符串搜索文件
在调试编译错误时,grep 的 –n
选项非常有用。它会显示给定搜索字符串在文件中的行号:
# grep -n "main" setup.py
8. 在所有目录中递归搜索字符串
如果您想在当前目录以及所有子目录中搜索字符串,可以指定 –r
选项进行递归搜索:
# grep -r “function” *
9. 搜索整个模式
将 -w
选项传递给 grep 可以搜索字符串中的整个模式。例如,使用:
# ifconfig | grep -w "RUNNING"
将打印包含引号中模式的行。另一方面,如果尝试:
# ifconfig | grep -w "RUN"

将不返回任何内容,因为我们不是在搜索模式,而是在搜索整个单词。
10. 在Gzipped文件中搜索字符串
值得一提的是grep的衍生物。首先是zgrep,它类似于zcat,用于处理gzipped文件。它接受与grep相同的选项,并以相同的方式使用:
# zgrep -i error /var/log/syslog.2.gz

11. 在文件中匹配正则表达式
egrep命令是另一个代表“扩展全局正则表达式”的衍生物。它识别额外的表达式元字符,如at + ? |
和()
。
egrep命令对于搜索源文件和其他代码片段非常有用,如果有需要的话。它可以通过指定-E
选项从常规grep中调用。
grep -E
12. 搜索固定模式字符串
fgrep命令在文件或文件列表中搜索固定模式字符串。它与grep -F
相同。使用fgrep的常见方法是向其传递一个模式文件:
fgrep –f file_full_of_patterns.txt file_to_search.txt
这只是一个使用grep的起点,但正如你可能已经注意到的,它在各种情况下都是无价的。除了我们已经实现的简单一行命令之外,grep还可以用来编写强大的cron任务和健壮的shell脚本,作为开始。
发挥创造力,尝试使用man页面上的选项,并想出符合你自己目的的grep表达式!
Source:
https://www.tecmint.com/12-practical-examples-of-linux-grep-command/