Linux Grep 命令的 12 个实例
您是否曾经遇到过在文件中查找特定字符串或模式的任务,但又不知道从哪里开始查找? 那么,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]
我发现熟悉grep 命令的最简单方法就是直接深入研究并使用一些真实世界的例子。
1. 在 Linux 中搜索并查找文件
假设您刚刚在您的机器上安装了新版Ubuntu的全新副本,并且您将尝试使用Python脚本。
您一直在网上搜索教程,但您发现正在使用两个不同版本的Python,并且您不知道安装程序在 Ubuntu 上安装了哪个版本的 Python ,或者是否安装了任何模块。
只需使用grep运行以下dpkg 命令,如下所示:
# dpkg -l | grep -i python
ii libpython3-stdlib:amd64 3.8.2-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version) ii libpython3.8:amd64 3.8.10-0ubuntu1~20.04.5 amd64 Shared Python runtime library (version 3.8) ii libpython3.8-minimal:amd64 3.8.10-0ubuntu1~20.04.5 amd64 Minimal subset of the Python language (version 3.8) ii libpython3.8-stdlib:amd64 3.8.10-0ubuntu1~20.04.5 amd64 Interactive high-level object-oriented language (standard library, version 3.8) ii python-apt-common 2.0.0ubuntu0.20.04.8 all Python interface to libapt-pkg (locales) ii python3 3.8.2-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version) ii python3-apport 2.20.11-0ubuntu27.24 all Python 3 library for Apport crash report handling ii python3-apt 2.0.0ubuntu0.20.04.8 amd64 Python 3 interface to libapt-pkg ii python3-aptdaemon 1.1.1+bzr982-0ubuntu32.3 all Python 3 modules for the server and client of aptdaemon ii python3-aptdaemon.gtk3widgets 1.1.1+bzr982-0ubuntu32.3 all Python 3 GTK+ 3 widgets to run an aptdaemon client ii python3-blinker 1.4+dfsg1-0.3ubuntu1 all fast, simple object-to-object and broadcast signaling library ii python3-brlapi:amd64 6.0+dfsg-4ubuntu6 amd64 Braille display access via BRLTTY - Python3 bindings ...
首先,我们运行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 .
末尾使用了 来隐藏所有空行的输出。这样,我们在终端中只会看到配置设置。
DefaultRuntimeDir ${APACHE_RUN_DIR} PidFile ${APACHE_PID_FILE} Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} HostnameLookups Off ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn IncludeOptional mods-enabled/*.load IncludeOptional mods-enabled/*.conf Include ports.conf <Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory>
3. 在 Linux 中查找所有 .mp3 文件
grep对于从stdout进行过滤非常有用。例如,假设你有一个文件夹,里面装满了各种不同格式的音乐文件。
*.mp3
您想查找艺术家JayZ的所有文件,但不想要任何混音曲目。使用find 命令和几个grep管道即可实现此目的:
# find . –name “*.mp3” | grep –i JayZ | grep –vi “remix”
在这个例子中,我们使用find来打印所有带有扩展名的文件*.mp3
,通过管道将其grep –i
过滤掉并打印所有名为“ JayZ ”的文件,然后通过另一个管道过滤掉并且不打印所有带有字符串(在任何情况下)“ remixgrep –vi
”的文件名。
[ 你可能还喜欢:Linux Find 命令的 35 个实用示例]
4.显示搜索字符串之前或之后的行数
另外两个选项是–A
和–B
开关,它们显示匹配的行以及搜索字符串之前或之后的行数。
虽然手册页给出了更详细的解释,但我发现最容易记住的选项是–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. 在 Gzip 压缩文件中搜索字符串
值得一提的是 grep 的衍生产品。第一个是zgrep ,它与zcat类似,用于gzip文件。它采用与grep相同的选项,使用方式也相同:
# zgrep -i error /var/log/syslog.2.gz
11. 匹配文件中的正则表达式
egrep 命令是另一个派生命令,代表“扩展全局正则表达式”。它可以识别其他表达式元字符,例如at + ? |
和()
。
[ 您可能还喜欢:Linux 中的 Grep、Egrep 和 Fgrep 有什么区别? ]
egrep非常适合在需要时搜索源文件和其他代码片段。可以通过指定选项从常规grep–E
调用它。
# grep -E
12. 搜索固定模式字符串
fgrep在文件或文件列表中搜索固定模式字符串。它与 相同。使用fgrepgrep -F
的常见方法是将一个模式文件传递给它:
# fgrep –f file_full_of_patterns.txt file_to_search.txt
这只是grep的入门,但正如您可能看到的,它对于各种用途都非常有用。除了我们已实现的简单单行命令之外,grep还可用于编写功能强大的cron作业和强大的shell 脚本。
[ 你可能还喜欢:11 个关于字符类和括号表达式的高级 Linux ‘Grep’ 命令]
发挥创造力,试验手册页上的选项,并想出适合您自己目的的grep 表达式!