对多个字符串使用 Grep
作为 Bash 脚本编写者,你可能会发现自己需要解析大量文本以获取相关信息。有时该信息是无序的,这需要你找出一种模式来捕获所有相关数据。
在 Linux 中完成这项工作的最佳工具是由 Ken Thompson 在 1973 年左右编写的 grep
。grep
适用于所有现代 UNIX 系统。
本教程将广泛涵盖 grep
的使用,从基本示例(例如捕获单个短语到使用正则表达式或固定字符串捕获多个模式,假设使用 Bash 命令行)。
使用 grep
捕获简单的短语
使用 grep
的最简单方法是查找文件中出现的短语。给定一个目标词和一个文件,我们可以在文件中搜索该词,如图所示。
user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux
user@linux:~$ grep word file.txt
word
words
sword
正如你在上面看到的,所有包含子字符串 word
的单词都被捕获。
你还可以捕获程序的输出并 grep
短语的输出,如图所示。我们将继续使用该文件作为示例,但你可以使用任何打印到 stdout
的程序来执行此操作。
user@linux:~$ cat file.txt | grep word
word
words
sword
如果你希望 grep
仅打印完全匹配的短语(即,它们周围有空格并且不是其他单词的子字符串),你可以使用 -w
/--word-regexp
标志来启用整体词匹配。
如果短语显示为单行,你可以使用相同的想法来匹配短语,使用 -x
/--line-regexp
。
user@linux:~$ cat file.txt | grep -w word
word
带有多个字符串的 grep
要使用由换行符分隔的多个短语来捕获来自程序的文件或文本流中的相关匹配,你可以使用 -F
/--fixed-strings
来指定它们。
你可以传入一个如下所示的字符串来代替少量匹配,用美元符号表示换行符。
grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt
对于文件中的更大列表,你可以使用 cat
将文件打印为 grep
的参数并重用相同的语法。
user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword
grep
与正则表达式
如果你熟悉 RegEx,本节将非常方便。使用 -E
/--extended-regexp
,你可以指定一个正则表达式模式来捕获更复杂的短语,这些短语不能用单个或多个短语来捕捉。
给定一个随机包含电子邮件地址和 URL 的文件,我们可能希望通过单独调用 grep
命令过滤掉与电子邮件或 URL 匹配的行。
用于捕获电子邮件的一个简单的、主要是幼稚的 RegEx 模式是 [^\@]+\@[^\.]+.*
。要将其与 grep
一起使用,你可以执行以下操作:
user@linux:~$ cat file.txt
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com
另一个利用 RegEx 的示例是指定多个模式以查看它们中的每一个是否都存在于文件中。为此,我们有以下模式。
请注意以下示例中使用的两种 RegEx 模式之间的比较 - 一种使用 OR
运算符,另一种是这样编写的,该行必须包含所有三个单词。
user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple
请记住,grep
并不是 UNIX 系统中唯一可用的字符串匹配工具。你也可以使用 awk
来捕捉复杂的模式。你还可以使用 sed
根据匹配条件替换短语。
相关文章
如何在 CentOS 中获取 IP 地址
发布时间:2023/05/04 浏览次数:108 分类:操作系统
-
这篇简短的文章是对 CentOS 的一个简短介绍,然后简要讨论了我们如何使用命令行界面 (CLI) 在 CentOS 中获取服务器 IP 地址。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Bash 中创建进度条
发布时间:2023/05/04 浏览次数:164 分类:操作系统
-
这是有关在 Bash 中创建进度条以显示正在运行的命令或进程的进度的指南。本文将探讨在 Bash(Linux 和 macOS 的默认 shell)中向 shell 脚本添加进度条的几种方法。使用 pv 命令在 Bash 中创建进度条