如何在 Linux 中使用 fgrep 命令搜索字符串

在本文中,我们讨论了fgrep命令的一些有用示例。初学者可以在日常生活中使用这些示例来提高使用 Li
首页 新闻资讯 行业资讯 如何在 Linux 中使用 fgrep 命令搜索字符串

759455485107b3c9f13781daf28c7584f49964.jpg

文本搜索是最常执行的操作之一。然而,如果用户不熟悉正确的工具,这个简单的任务很快就会变得很耗时。在 Linux 中,有各种文本过滤实用程序,例如 awk、sed、cut等。

但是,在 Linux 中,fgrep 是简单文本搜索的首选实用程序。在本指南中,我们将讨论可在日常生活中使用的 fgrep 命令的一些实践示例。

Linux 中的 fgrep 命令属于grep 命令家族。但是,它用于搜索固定字符串模式而不是正则表达式。因此,该命令的名称是fgrep(Fixed GREP)。

fgrep 命令的语法类似于其他 grep 系列命令:

复制

$ fgrep [选项] 模式 [文件]
  • 1.

首先,让我们创建一个包含以下内容的纯文本文件来使用示例:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ cat linuxmi.txt
  • 1.

  • 2.

d76012275ba4e4c8a866040b6a5d0506eddfe1.png

在 Linux 中查看文件内容

在这里,我们可以看到文本文件已准备好包含示例内容。现在让我们在接下来的几个示例中讨论 fgrep 命令的一些常见示例。

1. fgrep 与 grep 和 egrep 命令有何不同?

顾名思义,fgrep 命令用于搜索固定字符串模式。它将模式解释为固定字符串而不是正则表达式。因此,它以一种节省时间的方式执行搜索操作。

为了理解差异,让我们在 grep 命令中使用点(.)字符。

这个简单的正则表达式匹配除行尾之外的任何单个字符:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ grep at. linuxmi.txt
  • 1.

  • 2.

47f813f36b6bb862f9639607806797cd9f24c7.png

使用 Grep 搜索单个字符

在上面的输出中,我们可以看到点(.)字符与文本at、atc和att匹配。

现在,让我们对 fgrep 命令使用相同的模式并观察结果:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep at. linuxmi.txt
  • 1.

  • 2.

19fd49810ef3a82e65e4692c0ffba56c7e4b68.png

在上面的输出中,我们可以看到该命令无法找到给定的模式。

发生这种情况是因为 fgrep 命令无法识别正则表达式并尝试搜索不存在的模式 – “at.”。

2. 如何在文件中搜索字符串

让我们从基本示例开始,我们将在 linuxmi.txt 文件中搜索字符串 matches:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep matches linuxmi.txt
  • 1.

  • 2.

e2e864087a94abb04a1089723937d640dec728.png

在文件中搜索字符串

正如我们所看到的,成功在两个地方匹配成功,并以红色突出显示。

3. 如何设置匹配模式的 Grep 输出颜色

在前面的示例中,我们看到,默认情况下,匹配的模式以红色突出显示。但是,我们可以通过为 GREP_COLOR 环境变量分配不同的值来改变这种行为。

让我们将值32分配给GREP_COLOR环境变量以高亮显示绿色的匹配模式:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ export GREP_COLOR=32   ┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep matches linuxmi.txt
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

81f0bc337e97d62832195802e15124b5c347d9.png

为匹配模式设置 Grep 输出颜色

现在,在转到下一个示例之前,取消设置 GREP_COLOR 环境变量以启用默认行为:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ unset GREP_COLOR
  • 1.

  • 2.

76f9b9f665ce97dc48f6893387aaf36587f047.png

4.如何在一个文件中搜索多个模式

有时,我们需要对多个字符串进行模式匹配。在这种情况下,我们可以提供文本文件中的模式而不是命令行参数。

让我们创建一个文本文件,在单独的一行中包含多个模式:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ cat kotlin.txt nameglobs
  • 1.

  • 2.

  • 3.

  • 4.

159a1ed8947da43e741000432b8c7a9a0cdf48.png

现在,让我们将此文件与-f多个模式匹配选项一起使用:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -f kotlin.txt linuxmi.txt
  • 1.

  • 2.

749944227da730c74e74309c10d400fe2a3dfb.png

使用 fgrep 搜索多个模式

在上面的输出中,我们可以看到字符串professionals和website的模式匹配成功。

5.如何限制文件中的匹配数

默认情况下,fgrep 命令会继续执行模式匹配,直到处理完整个文件。

但是,有时我们需要限制匹配的数量。在这种情况下,我们可以-m在命令中使用该选项:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -m 1 file linuxmi.txt
  • 1.

  • 2.

49cfe7371cc0940d1a2231199e6ed033dee5ef.png

在此示例中,fgrep命令在匹配第一个模式后停止文件处理。

6. 查找模式时如何打印文件名

有时,我们只需要找到存在特定模式的文件的名称。在这种情况下,我们可以使用 fgrep 命令的-l选项:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -l file linuxmi.txtlinuxmi.txt
  • 1.

  • 2.

  • 3.

54478b665802abe39e9315b3d703ec40f906da.png

在这里,我们可以看到该命令只打印文件名而不是具有匹配模式的行。

7.模式匹配失败时如何打印文件名

在前面的示例中,我们看到了如何在模式匹配成功时打印文件名。现在,让我们看看如何以相反的方式执行操作。

让我们尝试在文件中找到不存在的模式并观察结果:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -L non-existing-word linuxmi.txtlinuxmi.txt
  • 1.

  • 2.

  • 3.

842b6b772de450baec2644b9873865f408fb0c.png

在这个例子中,我们使用了-L当模式匹配不成功时打印文件名的命令选项。

8. 如何忽略错误信息

在编写 shell 脚本时,错误处理起着至关重要的作用。但是,在一些非关键场景中,我们可以安全地忽略错误消息。

在fgrep中,我们可以使用-s 忽略与不存在或不可读文件相关的错误的选项。为了更好地理解这种行为,让我们尝试在不存在的文件中搜索模式:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -s kotlin non-linux.txt         
                                                                          ┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ echo $?                                                           2 ⨯2
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

a47b9f923163f74a37f6983f4ce9a01173bbe7.png

在上面的输出中,我们可以看到该命令没有在标准错误流中显示任何错误。但是,失败是由非零返回值报告的。

除此之外,我们还可以在文件不可读时观察到相同的行为。因此,首先,使用chmod命令修改文件权限:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ chmod 000 linuxmi.txt 
                                                                          ┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ ls -l linuxmi.txt---------- 1 linuxmi linuxmi 370 11月 20 19:03 linuxmi.txt
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

e65ff6071c9e96e2010581e45b25f1f048eb45.png

现在,尝试搜索模式并观察结果:

复制

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ fgrep -s name linuxmi.txt    
                                                                          ┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]└─$ echo $?                                                           2 ⨯2
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

c7e9419676fd0b17934354d4563c39f981795d.png

Grep 忽略错误信息

27    2022-11-21 12:06:24    fgrep 命令 Linux