20 个 Linux egrep 命令示例
简介:在本指南中,我们将讨论 egrep 命令的一些实际示例。遵循本指南后,用户将能够在 Linux 中更有效地执行文本搜索。
您是否曾因无法在日志中找到所需信息而感到沮丧?从大型数据集中提取所需信息是一项复杂且耗时的任务。
如果操作系统没有提供正确的工具,事情就会变得非常具有挑战性,这时 Linux 可以帮你解决。Linux 提供了各种文本过滤实用程序,例如awk、sed、cut等。
然而,egrep 是 Linux 中最强大和最常用的文本处理实用程序之一,我们将讨论egrep命令的一些示例。
Linux 中的egrep命令属于grep 命令家族,用于在文件中搜索和匹配特定模式。它的工作原理类似于grep -E(grep 扩展正则表达式),但它主要搜索特定文件,甚至逐行搜索或打印给定文件中的行。
egrep命令的语法如下:
$ egrep [OPTIONS] PATTERNS [FILES]
让我们创建一个包含以下内容的示例文本文件作为示例:
$ cat sample.txt
到这里,我们可以看到文本文件已经制作完成了,下面我们来讨论几个日常中常用的例子。
1. 如何在单个文件中查找模式
professional
让我们从一个简单的模式匹配示例开始,我们可以使用以下命令在sample.txt文件中搜索字符串:
$ egrep professionals sample.txt
在这里,我们可以看到该命令打印包含指定模式的行。
2. 如何在文件中突出显示匹配的模式
我们可以通过突出显示匹配的模式来使输出更具信息量。为此,我们可以使用egrep--color
命令的选项。例如,以下命令将以红色突出显示文本:professionals
$ egrep --color=auto professionals sample.txt
在这里,我们可以看到,与前一个相比,相同的输出具有更多信息。此外,我们可以轻松识别出该单词professionals
重复了两次。
在大多数 Linux 系统上,上述设置默认使用以下别名启用:
$ alias egrep='egrep –color=auto'
3. 如何在多个文件中查找一个模式
egrep命令接受多个文件作为参数,这使我们能够在多个文件中搜索特定模式。让我们通过一个例子来理解这一点。
首先,创建sample.txt文件的副本:
$ cp sample.txt sample-copy.txt
professionals
现在,在两个文件中搜索模式:
$ egrep professionals sample.txt sample-copy.txt
在上面的例子中,我们可以在输出中看到文件名,它代表该文件中匹配的行。
4. 如何计算文件中匹配的行数
有时我们只需要找出文件中是否存在该模式。如果是,那么它存在于多少行中?在这种情况下,我们可以使用-c
该命令的选项。
例如,下面的命令将显示1作为输出,因为该单词professionals
仅出现在一行中。
$ egrep -c professionals sample.txt 1
5. 如何仅打印文件中匹配的行
在上例中,我们看到该-c
选项不计算模式出现的次数。例如,该单词professionals
在同一行中出现两次,但该-c
选项仅将其视为一次匹配。
在这种情况下,我们可以使用命令的选项仅打印匹配的模式。例如,以下命令将在两行上-o
显示单词:professionals
$ egrep -o professionals sample.txt
现在,让我们使用wc 命令来计算行数:
$ egrep -o professionals sample.txt | wc -l
在上面的例子中,我们使用了egrep和wc命令的组合来计算特定模式出现的次数。
6. 如何通过忽略大小写来寻找规律
默认情况下,egrep以区分大小写的方式执行模式匹配。这意味着单词 – we、We、wE 和 WE 被视为不同的单词。但是,我们可以使用该-i
选项强制不区分大小写的搜索。
例如,在下面的命令中,文本we
和的模式匹配将成功We
:
$ egrep -i we sample.txt
7. 如何排除部分匹配的模式
在前面的例子中,我们看到egrep命令执行部分匹配。例如,当我们搜索文本we
时,模式匹配对其他文本也成功。例如 web、website 和 were。
为了克服这个限制,我们可以选择-w
强制进行全词匹配。
$ egrep -w we sample.txt
8. 如何反转文件中的模式匹配
到目前为止,我们使用egrep命令打印了指定模式所在的行。但是,有时我们想以相反的方式执行操作。
例如,我们可能想要打印不存在给定模式的行。我们可以借助以下选项来实现这一点-v
:
$ egrep -v we sample.txt
在这里,我们可以看到该命令打印了所有不包含文本的行we
。
9. 如何找到图案的行号
我们可以使用-n
命令的选项来启用行号,当模式匹配成功时,它会在输出中显示行号。这个简单的技巧使输出更有意义。
$ egrep -n professionals sample.txt
在上面的输出中,我们可以看到该单词professionals
出现在第五行。
10. 如何在安静模式下执行模式匹配
在安静模式下,egrep命令不会打印匹配的模式。所以我们必须使用命令的返回值来判断模式匹配是否成功。
我们可以使用-q
该命令的选项来启用安静模式,这在编写 shell 脚本时非常方便。
$ egrep -q professionals sample.txt $ egrep -q non-existing-pattern sample.txt
在这个例子中,零返回值表示模式存在,而非零返回值表示模式不存在。
11. 如何显示模式匹配之前的行
有时,显示匹配模式周围的几行是有意义的。对于这种情况,我们可以使用-B
该命令的选项,显示匹配模式之前的N行。
例如,以下命令将打印模式匹配成功的行以及其前两行。
$ egrep -B 2 -n professionals sample.txt
在这个例子中,我们使用了-n
显示行号的选项。
12. 如何显示模式匹配后的行
类似地,我们可以使用-A
命令的选项来显示模式匹配后的行。例如,下面的命令将打印模式匹配成功的行以及接下来的两行。
$ egrep -A 2 -n professionals sample.txt
13. 如何显示模式匹配周围的线条
除此之外,egrep命令还支持结合选项和-C
功能的选项,显示匹配模式之前和之后的行。-A
-B
$ egrep -C 2 -n professionals sample.txt
14. 如何以递归方式在多个文件中查找模式
如前所述,我们可以对多个文件执行模式匹配。然而,当文件存在于多个子目录下并且我们将它们全部作为命令参数传递时,情况就变得棘手了。
在这种情况下,我们可以使用选项以递归方式执行模式匹配,-r
如下例所示。
首先,创建 2 个子目录并将sample.txt文件复制到其中:
$ mkdir -p dir1/dir2 $ cp sample.txt dir1/ $ cp sample.txt dir1/dir2/
现在,让我们以递归的方式执行搜索操作:
$ egrep -r professionals dir1
在上面的例子中,我们可以看到dir1/dir2/sample.txt和dir1/sample.txt文件的模式匹配成功。
15.如何使用正则表达式匹配单个字符
我们可以使用点(.)
字符来匹配除行尾之外的任何单个字符。例如,以下正则表达式匹配文本 har、hat 和 has:
$ egrep "ha." sample.txt
16. 如何匹配零次或多次出现的字符
我们可以使用星号(*)
来匹配前一个字符的零次或多次出现。例如,下面的正则表达式匹配包含字符串we
后跟零次或多次字符 的文本b
。
$ egrep "web*" sample.txt
17. 如何匹配前一个字符的一个或多个出现
我们可以使用加号(+)
来匹配前一个字符的一个或多个出现。例如,下面的正则表达式匹配包含字符串we
且后跟至少一次字符的文本b
。
$ egrep "web+" sample.txt
在这里,我们可以看到,由于缺少字符,模式匹配对于单词 –we
和失败。were
b
18. 如何匹配行的开头
我们可以使用插入符号(^)
来表示行的开始。例如,以下正则表达式打印以文本开头的行We
:
$ egrep "^We" sample.txt
19. 如何匹配行尾
我们可以使用美元符号($)
来表示行尾。例如,下面的正则表达式打印以文本结尾的行e.
:
$ egrep "e.$" sample.txt
20. 如何删除文件中的空行
我们可以使用插入符号后面(^)
紧跟着美元符号($)
来表示空行。让我们在正则表达式中使用它来删除空行:
$ egrep -n -v "^$" sample.txt
在上面的输出中,我们可以看到行号 2、4、6、8 和 10 没有显示,因为它们是空的。
结论
在本文中,我们讨论了一些egrep命令的有用示例。人们可以在日常生活中使用这些示例来提高工作效率。
您知道 Linux 中 egrep 命令的其他最佳示例吗?请在下面的评论中告诉我们您的观点。