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]    

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
Finding Files with Grep Command

首先,我们运行了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 .以隐藏所有空行的输出。这样我们在终端中只会看到配置设置。

Print Uncommented Lines in Linux

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
Print Number of Lines Before and After String

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"
Find Entire Pattern

将不返回任何内容,因为我们不是在搜索模式,而是在搜索整个单词。

10. 在Gzipped文件中搜索字符串

值得一提的是grep的衍生物。首先是zgrep,它类似于zcat,用于处理gzipped文件。它接受与grep相同的选项,并以相同的方式使用:

# zgrep -i error /var/log/syslog.2.gz
Search String in Gzipped Files

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/