Linux 中的 Grep 命令(附示例)

2023-10-12

在本教程中,您将学习如何使用非常重要的grepLinux 中的命令。我们将讨论为什么掌握这个命令很重要,以及如何在命令行的日常任务中使用它。

让我们通过一些解释和示例来深入探讨。

 

 

为什么我们使用 grep?

Grep 是 Linux 用户用来搜索文本字符串的命令行工具。您可以使用它来搜索文件中的某个单词或单词组合,也可以通过管道传输其他单词的输出Linux命令grep,因此 grep 可以只显示您需要查看的输出。

让我们看一些非常常见的例子。假设您需要检查目录的内容以查看其中是否存在某个文件。这就是你可以使用“ls”命令的目的。

但是,为了使检查目录内容的整个过程更快,您可以将 ls 命令的输出通过管道传递给 grep 命令。让我们在主目录中查找名为 Documents 的文件夹。

现在,让我们尝试再次检查目录,但这次使用 grep 专门检查 Documents 文件夹。


$ ls | grep Documents  

正如您在上面的屏幕截图中看到的,使用 grep 命令可以快速将我们搜索的单词与 ls 命令产生的其余不必要的输出隔离开来,从而节省了我们的时间。

如果 Documents 文件夹不存在,grep 将不会返回任何输出。因此,如果 grep 没有返回任何内容,则意味着它找不到您要搜索的单词。

查找字符串

如果您需要搜索文本字符串,而不仅仅是单个单词,则需要将该字符串括在引号中。例如,如果我们需要搜索“我的文档”目录而不是单字“文档”目录怎么办?


$ ls | grep 'My Documents'  

Grep 将接受单引号和双引号,因此请使用其中之一将文本字符串括起来。

虽然您可以使用 grep 搜索从其他命令行工具传递的输出,但您也可以使用它直接搜索文档。这是一个在文本文档中搜索字符串的示例。


$ grep 'Class 1' Students.txt  

查找多个字符串

您还可以使用 grep 查找多个单词或字符串。您可以使用 -e 开关指定多个模式。让我们尝试在文本文档中搜索两个不同的字符串:


$ grep -e 'Class 1' -e Todd Students.txt  

请注意,我们只需要在包含空格的字符串周围使用引号。

grep、egrep fgrep、pgrep、zgrep 之间的区别

历史上,各种 grep 开关包含在不同的二进制文件中。在现代 Linux 系统上,您会发现这些开关在基本 grep 命令中可用,但发行版也通常支持其他命令。

从 grep 的手册页中:

egrep 相当于 grep -E

该开关会将模式解释为扩展正则表达式。您可以用它做很多不同的事情,但这里有一个使用 grep 正则表达式的示例。

让我们在文本文档中搜索包含两个连续“p”字母的字符串:


$ egrep p\{2} fruits.txt  

or


$ grep -E p\{2} fruits.txt  

fgrep 相当于 grep -F

此开关将模式解释为固定字符串列表,并尝试匹配其中的任何一个。当您需要搜索正则表达式字符时,它非常有用。这意味着您不必像使用常规 grep 那样转义特殊字符。

pgrep 是一个命令,用于搜索系统上正在运行的进程的名称并返回其各自的进程 ID。例如,您可以使用它来查找 SSH 守护程序的进程 ID:


$ pgrep sshd  

这在功能上类似于将“ps”命令的输出通过管道传递给 grep。

您可以使用此信息杀死一个正在运行的进程或解决系统上运行的服务的问题。

您可以使用 zgrep 搜索压缩文件中的模式。它允许您搜索压缩存档内的文件,而无需先解压缩该存档,基本上节省了您一两个额外的步骤。


$ zgrep apple fruits.txt.gz  

zgrep 也适用于 tar 文件,但似乎只能告诉您它是否能够找到匹配项。

我们提到这一点是因为使用 gzip 压缩的文件通常是 tar 存档。

查找和 grep 之间的区别

对于那些刚刚开始使用 Linux 命令行的人来说,重要的是要记住 find 和 grep 是两个具有两个非常不同功能的命令,尽管我们使用这两个命令来“查找”用户指定的内容。

当您使用 grep 来搜索 ls 命令的输出时,使用 grep 来查找文件会很方便,正如我们在本教程的第一个示例中所示的那样。

但是,如果您需要递归搜索文件名(或者使用通配符(星号)则搜索文件名的一部分),则可以使用“find”命令。


$ find /path/to/search -name name-of-file  

上面的输出表明查找命令能够成功找到我们搜索的文件。

递归搜索

您可以将 -r 开关与 grep 结合使用,以递归方式搜索目录及其子目录中的所有文件以查找指定模式。


$ grep -r pattern /directory/to/search  

如果您不指定目录,grep 将只搜索您当前的工作目录。在下面的屏幕截图中,grep 找到了两个与我们的模式匹配的文件,并返回它们的文件名和它们所在的目录。

捕获空格或制表符

正如我们前面在解释如何搜索字符串时提到的,如果文本包含空格,您可以将文本括在引号内。同样的方法也适用于选项卡,但我们稍后将解释如何在 grep 命令中添加选项卡。

在引号内放入一个或多个空格即可让 grep 搜索该字符。


$ grep " " sample.txt  

您可以通过几种不同的方法使用 grep 搜索选项卡,但大多数方法都是实验性的,或者在不同的发行版中可能不一致。

最简单的方法是只搜索制表符本身,您可以通过在键盘上按 ctrl+v,然后按制表符来生成该字符。

通常,在终端窗口中按 Tab 会告诉终端您要自动完成命令,但事先按 ctrl+v 组合将导致制表符按照您通常在文本编辑器中期望的方式写出。


$ grep "    " sample.txt  

在 Linux 中查找配置文件时,了解这个小技巧特别有用,因为制表符经常用于将命令与其值分开。

使用正则表达式

Grep 的功能通过使用正则表达式得到进一步扩展,使您的搜索更加灵活。存在几种,我们将在下面的示例中介绍一些最常见的:

[ ] 括号用于匹配任意一组字符。


$ grep "Class [123]" Students.txt  

此命令将返回任何显示“Class 1”、“Class2”或“Class 3”的行。

[-] 带连字符的括号可用于指定字符范围,无论是数字还是字母。


$ grep "Class [1-3]" Students.txt  

我们得到与以前相同的输出,但命令更容易键入,特别是如果我们有更大范围的数字或字母。

^ caret用于搜索仅出现在行开头的模式。


$ grep "^Class" Students.txt  

[^] 带插入符号的括号用于从搜索模式中排除字符。


$ grep "Class [^1-2]" Students.txt  

$ 美元符号用于搜索仅出现在行尾的模式。


$ grep "1$" Students.txt  

. dot 用于匹配任意一个字符,因此它是一个通配符,但仅适用于单个字符。


$ grep "A….a" Students.txt  

Grep gz 文件而不解压

正如我们之前所展示的,您可以使用 zgrep 命令搜索压缩文件,而无需先解压缩它们。


$ zgrep word-to-search /path/to/file.gz  

您还可以使用 zcat 命令显示 gz 文件的内容,然后将该输出通过管道传输到 grep 以隔离包含搜索字符串的行。


$ zcat file.gz | grep word-to-search  

Grep zip 文件中的电子邮件地址

我们可以使用奇特的正则表达式从 zip 文件中提取所有电子邮件地址。


$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt  

-o 标志将提取电子邮件地址only,而不是显示包含电子邮件地址的整行。这会产生更干净的输出。

与 Linux 中的大多数事情一样,有不止一种方法可以做到这一点。您还可以使用egrep 和一组不同的表达式。但上面的示例工作得很好,并且是提取电子邮件地址并忽略其他所有内容的非常简单的方法。

查询 IP 地址

Grep 查找 IP 地址可能会变得有点复杂,因为我们不能只告诉 grep 查找由点分隔的四个数字 - 好吧,我们could,但该命令也有可能返回无效的 IP 地址。

以下命令将查找并隔离only valid IPv4 地址:


$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log  

我们在 Ubuntu 服务器上使用它只是为了查看最新的 SSH 尝试是从哪里进行的。

为了避免重复信息并防止其淹没屏幕,您可能需要将 grep 命令通过管道传输到“uniq”和“more”,就像我们在上面的屏幕截图中所做的那样。

grep 或条件

您可以通过几种不同的方式在 grep 中使用 or 条件,但我们将向您展示需要最少击键次数且最容易记住的一种方式:


$ grep -E 'string1|string2' filename  

或者,从技术上讲,使用 egrep 的击键次数甚至更少:


$ egrep 'string1|string2' filename  

忽略大小写

默认情况下,grep 区分大小写,这意味着搜索字符串的大小写必须精确。您可以通过使用 -i 开关告诉 grep 忽略大小写来避免这种情况。


$ grep -i string filename  

搜索时区分大小写

如果我们想要搜索一个字符串,其中第一个可以是大写或小写,但字符串的其余部分应该是小写怎么办?在这种情况下,使用 -i 开关忽略大小写将不起作用,因此一个简单的方法是使用括号。


$ grep [Ss]tring filename  

此命令告诉 grep 除第一个字母外区分大小写。

grep 精确匹配

在上面的示例中,每当我们在文档中搜索字符串“apple”时,grep 也会返回“pineapple”作为输出的一部分。为了避免这种情况,并严格搜索“apple”,您可以使用以下命令:


$ grep "\<apple\>" fruits.txt  

您还可以使用 -w 开关,它会告诉 grep 该字符串必须匹配整行。显然,这只适用于您不希望该行的其余部分有任何文本的情况。

排除模式

要查看文件的内容但从输出中排除模式,可以使用 -v 开关。


$ grep -v string-to-exclude filename  

正如您在屏幕截图中看到的,当我们使用 -v 开关运行相同的命令时,我们排除的字符串不再显示。

查找并替换

通过管道传输到 sed 的 grep 命令可用于替换文件中字符串的所有实例。此命令将在与当前工作目录相关的所有文件中将“string1”替换为“string2”:


$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'  

 

带行号的 Grep

要显示包含字符串的行号,请使用 -n 开关:


$ grep -n string filename  

显示之前和之后的行

如果您需要 grep 输出的更多上下文,您可以使用 -c 开关在指定的搜索字符串之前和之后显示一行:


$ grep -c 1 string filename  

指定您希望显示的行数 - 在本例中我们只显示了 1 行。

对结果进行排序

将 grep 输出通过管道传输到 sort 命令,以按某种顺序对结果进行排序。默认按字母顺序排列。


$ grep string filename | sort  

我希望您觉得本教程有用。继续回来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中的 Grep 命令(附示例) 的相关文章

  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach

随机推荐

  • Python 石头剪刀布:命令行游戏(概述)

    游戏编程是学习如何编程的好方法 您可以使用许多在现实世界中看到的工具 此外您还可以玩游戏来测试您的结果 开始 Python 游戏编程之旅的理想游戏是剪刀石头布 在本课程中 您将学习如何 自己编写代码剪刀石头布游戏 接受用户输入input 使
  • 2021 年 4 月 21 日

    主持人大卫 阿莫斯回答会员的问题 在这次会议上 我们讨论了 Real Python 的新功能 在哪里可以找到要阅读的代码以提高您的 Python 技能 为什么 0xfor x in 1 2 3 回报 15 数据科学 Django 和 Fla
  • Python 中的 K 均值聚类:实用指南

    目录 What Is Clustering 聚类技术概述 分区聚类 层次聚类 基于密度的聚类 How to Perform K Means Clustering in Python 了解 K 均值算法 使用 Python 编写您的第一个 K
  • 在 Python 中使用 lru_cache 进行缓存

    有很多方法可以实现快速响应的应用程序 缓存是一种方法 如果使用得当 可以使事情变得更快 同时减少计算资源的负载 蟒蛇的功能工具模块附带 lru cache 装饰器 这使您能够使用以下命令缓存函数的结果最近最少使用 LRU 策略 这是一种简单
  • 拼写错误、缺失或误用 Python 关键字

    以下是有关 Python 关键字的更多信息的资源 Python 关键字 简介 真正的 Python 文章 Python 3 8 关键字 Python 文档
  • Python 标准 REPL:快速尝试代码和想法

    目录 Getting to Know the Python Standard REPL 什么是 Python 的交互式 Shell 或 REPL 为什么使用 Python REPL Starting and Ending REPL Inte
  • 使用 Fabric 和 Ansible 自动化 Django 部署

    目录 设置和配置 Fabric Setup 设置 SSH 密钥 强化用户密码 安装 Ansible 依赖项 将 SELinux 设置为宽容模式 升级服务器 完整性检查 Ansible Primer 剧本 示例手册 Playbook Setu
  • 第 27 集:准备面试 Python 练习题

    第 27 集 准备面试 Python 练习题 真正的 Python 播客 2020 年 9 月 18 日47m RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君子 灰蒙蒙 袖珍铸件 投
  • Python 基础知识:函数和循环(摘要)

    在本视频课程中 您了解了两个最基本的概念 在编程中 函数和循环 首先 您学习了如何定义自己的自定义函数 你看到了 该函数由两部分组成 这函数签名 这开始于def关键字并包括函数名称和函数参数 这函数体 其中包含每当调用该函数时运行的代码 函
  • Python 的 urllib.request 用于 HTTP 请求

    目录 使用 urllib request 的基本 HTTP GET 请求 The Nuts and Bolts of HTTP Messages 了解什么是 HTTP 消息 了解 urllib request 如何表示 HTTP 消息 关闭
  • Django Ninja 的隐蔽 REST API(摘要)

    在本课程中 您已经了解了 Django Ninja REST API 库的所有内容 使用 Ninja 您可以 使用装饰器快速包装 Django 视图创建 REST API 端点 使用类型注释定义变量和参数 写Schema和ModelSche
  • Python 中的 Dijkstra 算法(查找最短路径)

    Dijkstra算法的工作原理是通过迭代找到节点的最短距离值 直到达到实际的最短距离 Dijkstra 算法的一个关键方面是它使用优先队列从尚未处理的节点集中选择具有最小暂定距离的顶点 当前节点被标记为已访问 并检查其所有邻居节点是否有更优
  • 使用 Pandas read_excel 读取 Excel 文件

    Pandas read excel是一个函数蟒蛇熊猫库允许我们在 Python 中读取 Excel 文件并将其转换为数据框 object read excel函数可以导入具有不同扩展名的Excel文件 例如 xls xlsx xlsm和 o
  • Pandas where() 方法:带条件过滤

    The where中的方法Pandas允许您根据条件过滤 DataFrame 或 Series 类似于 SQL 的 WHERE 子句 您是否曾经发现自己需要根据特定条件替换 DataFrame 中的某些值 或者可能想要屏蔽不符合某些条件的数
  • Linux find 命令:综合指南

    The findLinux 中的命令是一个功能强大的实用程序 用于根据您指定的条件搜索和定位文件和目录 它可以按名称 大小 类型 权限 日期和许多其他标准快速定位文件 目录 hide 1 基本语法 2 Finding Files by Na
  • 了解 Linux Sed 命令中的保持缓冲区

    保持缓冲区在sed允许您临时存储和检索输入行 将其视为辅助存储器 您可以在使用主模式空间时放置数据 当您需要一次执行涉及多行的操作时 保持缓冲区特别有用 保留缓冲区不是立即处理和打印每一行 而是让您保存一行 处理其他行 然后在需要时返回保存
  • Python zip 函数教程(简单示例)

    The zip function 是一个内置的 Python 函数 它接受两个或多个序列或集合 如列表或字符串 并创建一个并行聚合每个集合中的元素的迭代器 这种组合这些值的过程称为 压缩 它源于将两个单独的项目集合压缩在一起的想法 目录 h
  • Linux 测试命令:Bash 中的比较

    The testLinux 中的命令是一个命令行实用程序 用于检查和评估条件 它经常被用在bash 脚本测试文件属性 比较字符串和数字 并支持 AND OR 和 NOT 运算的复杂逻辑评估 目录 hide 1 语法和返回值 2 File T
  • Python 中的无穷大万无一失的指南

    数字是编程不可或缺的一部分 因此 编程语言支持各种数据类型来表示不同类型的数字 并提供各种使用它们的方法 这些数据类型中的每一种都对其可以表示的数字范围有一定的限制 有些可以代表小范围的数字 而另一些则支持很大的数字范围 根据我们的用例 我
  • Linux 中的 Grep 命令(附示例)

    在本教程中 您将学习如何使用非常重要的grepLinux 中的命令 我们将讨论为什么掌握这个命令很重要 以及如何在命令行的日常任务中使用它 让我们通过一些解释和示例来深入探讨 目录 hide 1 为什么我们使用 grep 2 查找字符串 3