如何在 Linux 中使用 grep 和正则表达式搜索文本模式

介绍

该grep命令是Linux终端环境中最有用的命令之一。grep全称为global regular expression print(全局正则表达式打印)。这意味着您可以grep用来查看接收到的输入是否与指定的模式匹配。这个看似微不足道的程序非常强大。它基于复杂规则对输入进行排序的能力,从而使其成为众多命令链中相当流行的链接。
在本教程中,您将探索grep命令的选项,然后将深入研究使用正则表达式进行更高级的搜索。
基本用法
在本教程中,您将使用grep在GNU通用公共许可证版本3中搜索各种单词和短语。
如果您使用的是Ubuntu系统,则可以在文件/usr/share/common-licenses夹中找到该文件。将其复制到您的主目录:
linuxmi@linuxmi:~/www.linuxmi.com$ cp /usr/share/common-licenses/GPL-3 .
如果您在其他系统上,请使用以下curl命令下载副本:
linuxmi@linuxmi:~/www.linuxmi.com$ curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt
您还将在本教程中使用BSD许可证文件。在Linux上,可以使用以下命令将其复制到主目录:
linuxmi@linuxmi:~/www.linuxmi.com$ cp /usr/share/common-licenses/BSD .
如果您在其他事系统上,请使用以下命令创建文件:
cat << 'EOF' > BSD
Copyright (c) The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors
  may be used to endorse or promote products derived from this software
  without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
EOF
准备好了这些文件后,就可以开始使用了grep。
在最基本的形式中,您grep用来匹配文本文件中的文字模式。这意味着,如果您传递grep一个单词进行搜索,它将打印出包含该单词的文件中的每一行。
执行以下命令以grep搜索包含单词的每一行GNU:
linuxmi@linuxmi:~/www.linuxmi.com$ grep 'GNU' GPL-3
第一个参数GNU是您要搜索的模式,第二个参数GPL-3是要搜索的输入文件。
结果输出将是包含模式文本的每一行:
在某些系统上,您搜索的模式将在输出中高亮显示。
常用选项
默认情况下,grep将在输入文件中搜索确切的指定模式,并返回找到的行。通过向中添加一些可选标志,可以使此行为更有用grep。
如果要grep忽略搜索参数的“大小写”并同时搜索大小写变体,则可以指定“ -i或” --ignore-case选项。
license使用以下命令在与以前相同的文件中搜索单词的每个实例(大小写,大小写混合):
linuxmi@linuxmi:~/www.linuxmi.com$ grep -i 'license' GPL-3
结果包括:LICENSE,license和License:
如下图:
如果存在带有的实例LiCeNsE,则该实例也将被返回。
如果要查找不包含指定模式的所有行,则可以使用-v或--invert-match选项。
the使用以下命令搜索BSD许可证中不包含单词的每一行:
linuxmi@linuxmi:~/www.linuxmi.com$ grep -v 'the' BSD
您将看到以下输出:
由于您未指定“忽略大小写”选项,因此最后两项没有单词the。
了解匹配发生的行号通常很有用。您可以使用-n或--line-number选项执行此操作。重新运行上一个示例,并添加以下标志:
linuxmi@linuxmi:~/www.linuxmi.com$ grep -vn 'the' BSD
您将看到以下文本:
现在,如果您要更改不包含的每一行,就可以引用行号the。使用源代码时,这特别方便。
正则表达式
在引言中,您了解到grep代表“全局正则表达式打印”。“正则表达式”是描述特定搜索模式的文本字符串。
不同的应用程序和编程语言实现的正则表达式略有不同。在本教程中,我们将只探索grep描述其模式的一小部分。
文字匹配
上面的例子,当我们搜索单词“GNU”和“the”时,我们实际上正在搜索非常简单的正则表达式,它匹配字符“GNU”和“the”的确切字符串。
这是有帮助的,总是认为这些匹配的字符串,而不是匹配一个字。这将变得更加重要的区别,因为我们学习更复杂的模式。
精确指定要匹配的字符的模式称为“字面值”,因为它们与字面上的字符匹配。
除非被其他表达机制修改,否则所有字母和数字字符(以及某些其他字符)在字面上匹配。
锚点匹配
锚点是特殊字符用来匹配任意的单字符,除了换行符。但点字符必须匹配一个字符,如果在点字符的位置没有字符,那么模式就不成立。
例如,使用锚点,您可以指定只想知道与该行GNU开始处匹配的行。为此,您可以^在文字字符串之前使用锚。
运行以下命令以搜索GPL-3文件并查找GNU在行的开头出现的行:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '^GNU' GPL-3
您将看到以下两行:
GNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
同样,您可以在$模式的末尾使用定位符来指示匹配仅在行的末尾才有效。
此命令将匹配字结尾的行and中GPL-3的文件:
linuxmi@linuxmi:~/www.linuxmi.com$ grep 'and$' GPL-3
您将看到以下输出:
匹配任何字符
在正则表达式中使用句点字符(.)表示在指定位置可以存在任何单个字符。
例如,要匹配GPL-3文件中包含两个字符和字符串的所有内容cept,可以使用以下模式:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '..cept' GPL-3
您将看到以下输出:
如您所见,输出包含两个词的accept和except和变体的实例。这种模式也将匹配z2cept。
括号表达式
通过将一组字符放在方括号(\[和\])中,可以指定该位置处的字符可以是方括号组中找到的任何一个字符。
例如,要查找包含too或的行two,您可以使用以下模式来简洁地指定这些变体:
linuxmi@linuxmi:~/www.linuxmi.com$ grep 't[wo]o' GPL-3
输出显示文件中同时存在两种变体:
括号符号为您提供了一些有趣的选项。您可以通过将方括号内的字符列表以一个字符开头,使模式与方括号内的字符(除字符之外)匹配^。
此示例类似于模式.ode,但与模式不匹配code:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '[^c]ode' GPL-3
这是您将看到的输出:
1. Source Code.
    model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
方括号的另一个有用特性是,您可以指定一个字符范围,而不是逐个输入每个可用字符。
这意味着,如果你想找到每一行以一个大写字母开头,你可以使用以下模式:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '^[A-Z]' GPL-3
这是您将看到的输出:
由于某些传统的排序问题,使用POSIX字符类而不是您刚才使用的字符范围通常更准确。
有许多字符类不在本指南的范围内,但是一个可以完成与上一个示例相同过程的示例\[:upper:\]在方括号选择器中使用了字符类:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '^[[:upper:]]' GPL-3
输出将与前面的相同。
重复模式零次或更多次
最后,最常用的元字符之一是星号或*,其意思是“将先前的字符或表达式重复零次或多次”。
要查找GPL-3文件中包含左括号和右括号的每行,并且只有字母和空格之间,请使用以下表达式:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '([A-Za-z ]*)' GPL-3
您将看到以下输出:
到目前为止,您已经在表达式中使用了句点,星号和其他字符,但是有时您需要专门搜索这些字符。
转义元字符
在某些情况下,您需要搜索原义句点或原义大括号,尤其是在使用源代码或配置文件时。由于这些字符在正则表达式中具有特殊含义,因此您需要“转义”这些字符以告知grep您在这种情况下不希望使用其特殊含义。
通过\在通常具有特殊含义的字符前面使用反斜杠字符()可以对字符进行转义。
例如,要查找以大写字母开头并以句点结尾的任何行,请使用以下表达式,该表达式转义结尾句点,以便它代表文字句点而不是通常的“任何字符”含义:
linuxmi@linuxmi:~/www.linuxmi.com$ grep '^[A-Z].*\.$' GPL-3
以下是您将看到的输出:
Output
Source.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
总结
grep 在查找文件内或文件系统层次结构中的模式时很有用,因此值得花一些时间来熟悉其选项和语法。
正则表达式的用途更加广泛,可以与许多流行的程序一起使用。例如,许多文本编辑器实现了用于搜索和替换文本的正则表达式。
此外,大多数现代编程语言都使用正则表达式对特定数据执行过程。一旦了解了正则表达式,您就可以将其知识转移到许多与计算机相关的常见任务上,从在文本编辑器中执行高级搜索到验证用户输入。
来自:Linux迷
链接:https://reurl.cc/7yDr8Q

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

(0)

相关推荐

  • Linux中的Grep命令(在文件中查找文本)

    [日期:2020-05-14]来源:Linux公社  作者:醉落红尘[字体:大 中 小]grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是 ...

  • 图解正则表达式,这一篇就够了

    <p data-darkmode-bgcolor-15962880449713="rgb(25, 25, 25)" data-darkmode-bgcolor-1603896 ...

  • 30分钟玩转「正则表达式」

    简介 推荐阅读:Jeffrey Friedl <精通正则表达式(第3版)>,本文是该书的读书笔记. 定义 正则表达式:regular expression, regex,是用来描述或者匹配 ...

  • 如何在 Linux 中找出 CPU 占用高的进程

    如何在 Linux 中找出 CPU 占用高的进程

  • 如何在Linux中使用WASI SDK将ZXing C ++构建为Wasm

    WASI是一个模块化的系统界面,旨在为任何符合WASI的运行时构建可运行的.wasm模块,而不仅仅是为Node.js和Web浏览器.尽管WASI仍在开发中并且尚未稳定,但是它可用于某些实验项目.在本文 ...

  • 教你如何在linux中写脚本提高工作效率

    程序IT圈 引入:在工作中,为了在开机前预置一些资源在手机系统中,可能有人会用很多方法去实现这个功能?不过,今天告诉大家一个用shell脚本去拷贝的方法,大家先看看以下代码,看是否能看懂 . #!/b ...

  • 如何在Linux中升级R?

    小编典典 注意 :现在,我在GitHub(此处)上有关于在Linux Mint或UbuntuLinux上升级R的最新指南,其中还包含有关tidyverse流行的数据处理程序集的系统依赖项的一些额外信息 ...

  • 如何在Linux中安装vnStat和vnStati监视网络流量

    VnStat是针对Linux和BSD的基于控制台的网络流量监视工具设计.它将保留所选网络接口的网络流量日志.为了生成日志,vnStat使用内核提供的信息. 换句话说,它不会嗅探网络流量,并且可以确保系 ...

  • 如何在 Linux 中把一个网页转换成 PDF

    如何在 Linux 下将网页转换为 PDF 文件 作者: Ankush Das 译者: LCTT geekpi | 2021-10-28 11:18 当你将某些资源存档或用于教育目的时,将网页保存为 ...

  • 6个使用正则表达式搜索文本中内容的工具

    本指南介绍了一些命令行工具,这些工具可用于搜索文本文件中的匹配字符串或模式.这些工具通常与正则表达式一起使用. |  grep命令 首先出现的是grep实用工具--它是Global Regular E ...

  • 如何在EXCEL中测试正则表达式(内附小测验)

    各位客官姥爷好,欢迎回来.我们上次聊到如何在EXCEL中定义正则表达式函数,那么这个正则表达式到底是什么呢?我们这次就来细聊.(文末附有小测验,欢迎大家尝试) 定义 正则表达式(Regular Exp ...