众所周知,文本搜索是最常执行的操作之一。然而,如果用户不熟悉正确的使用工具,这个简单的工作将会就会变得很复杂耗时。在Linux系统中,有各种文本过滤实用程序,例如awk、sed、cut等。
但是,在Linux中,fgrep是简单文本搜索的首选实用程序,fgrep命令属于grep 命令家族,但它用于搜索固定字符串模式而不是正则表达式。因此,该命令的名称是fgrep(固定GREP)。在本文中,小编将简单介绍正确使用fgrep命令的一些示例。
其实,fgrep命令的语法类似于其他grep 系列命令,如下所示:
$ fgrep [OPTIONS] PATTERNS [FILES]
$ cat input.txt
在这里,可以看到文本文件已准备好包含示例内容,接下来的几个示例中讨论fgrep命令的一些常见使用方法。
1、fgrep与grep和egrep命令有何不同?
顾名思义,fgrep命令用于搜索固定字符串模式,它将模式解释为固定字符串而不是正则表达式。因此,它以一种节省时间的方式执行搜索操作。
为了理解差异,这里在grep命令中使用点(.)
字符。这个简单的正则表达式匹配除行尾之外的任何单个字符:
$ grep ha. input.txt
在上面的输出中,可以看到点(.)
字符与文本har、hat和has相匹配。
现在,继续对fgrep命令使用相同的模式并观察结果:
$ fgrep ha. input.txt
在输出结果可以看到,该命令无法找到给定的模式的匹配结果。出现这种情况是因为fgrep命令无法识别正则表达式并尝试搜索不存在的模式 – “ha.”
。
另外,Egrep或grep-E是grep另一扩展版本。Egrep在搜索正则表达式模式时高效且快速,因为它按原样处理元字符,而不像grep中那样将它们替换为字符串,因此无需将它们转义为在grep中,Egrep使用ERE或扩展正则表达式集。
所以,在Egrep的情况下,即使不转义元字符,它也会将它们视为特殊字符,并将其替换为其特殊含义,而不是将其视为字符串的一部分。
$ egrep -C 0 '(f|g)ile' check_file $ egrep -C 0 '\(f\|g\)ile' check_file
在这里,当元字符没有转义时,egrep搜索“file”字符串,因为这意味着这些字符的含义。但是,当这些字符被转义时,egrep将它们作为字符串的一部分,并在文件中搜索完整的字符串“(f|g)ile”。
2、如何在文件中进行搜索
仍然从基本示例开始,现在将在input.txt文件中搜索字符串“professional”,命令如下:
$ fgrep professionals input.txt
正如上图所看到的,模式匹配在两个地方成功了,并以红色突出显示。
3、如何设置匹配模式的Grep输出颜色
在上面的示例中可以看到,默认情况下,匹配的模式以红色突出显示。但是,可以通过为环境变量GREP_COLOR
分配不同的值来改变这种行为。
这里将值32分配给GREP_COLOR
环境变量以突出显示绿色的匹配模式:
$ export GREP_COLOR=32 $ fgrep professionals input.txt
在进入下一个示例之前,取消设置GREP_COLOR环境变量以启用默认行为:
$ unset GREP_COLOR
4、如何在一个文件中搜索多个模式
有时候,需要对多个字符串进行模式匹配。在这种情况下,可以提供文本文件中的模式而不是命令行参数。
这里创建一个文本文件,在单独的一行中包含多个模式,命令如下:
$ cat pattern.txt professionals website
现在,让我们将此文件与多个模式匹配选项-f
一起使用:
$ fgrep -f pattern.txt input.txt
在上面的输出中,可以看到字符串professionals和website的模式匹配成功。
5、如何限制文件中的匹配数
默认情况下,fgrep命令会继续执行模式匹配,直到处理完整个文件。但是,有时候需要限制匹配的数量。在这种情况下,可以在命令中使用-m
选项:
$ fgrep -m 1 professionals input.txt TecMint was started on 15th August 2012 by technical professionals and all the
在此示例中,fgrep命令在匹配第一个模式后停止文件处理。
6、如何在搜索模式时显示文件名
如果只需要找到存在特定模式的文件的名称。在这种情况下,可以使用fgrep命令的-l
选项:
$ fgrep -l professionals input.txt input.txt
在这里,可以看到该命令只显示文件名而不是具有匹配模式的行。
七、模式匹配失败时如何显示文件名
在前面的示例中,已经看到了如何在模式匹配成功时显示文件名。现在来看看如何以相反的方式执行操作。
这里尝试在文件中找到不存在的模式并观察结果:
$ fgrep -L non-existing-word input.txt input.txt
在这个例子中,使用了当模式匹配不成功时打印文件名的-L
命令选项。
八、如何抑制错误信息
在编写shell脚本时,错误处理起着至关重要的作用。但是,在一些非关键场景中,可以安全地忽略错误消息。在fgrep中,可以使用抑制与不存在或不可读文件相关的错误的-s
选项。
为了更好地理解这种行为,现在尝试在不存在的文件中搜索模式:
$ fgrep -s professionals non-existing-file.txt $ echo $? 2
在上面的输出中,可以看到该命令没有在标准错误流中显示任何错误。但是,失败是由非零返回值报告的。
除此之外,还可以在文件不可读时观察到相同的行为,所以,首先使用chmod命令修改文件权限:
$ chmod 000 input.txt $ ls -l input.txt
现在,尝试搜索模式并观察结果:
$ fgrep -s professionals input.txt $ echo $?
总结
在本文中,小编简单介绍了fgrep命令的一些有用示例,Linux新手用户可以在日常生活中使用这些示例来提高使用Linux 工作效率。通过熟练掌握以上内容,Linux初学者将能够使用命令行界面高效地执行文本搜索操作。
以上fgrep命令的简单示例仅供参考,旨在帮助大家更好的使用fgrep命令进行搜索设置。如果你还有更好的演示示例,欢迎分享出来供大家参看。