grep、pgrep、egrep、fgrep 有什么区别?

Eri*_*ski 60 linux grep command-line

我想通过对之间的差异散步greppgrepegrep,以及fgrep和我将如何使用它们。

Eri*_*ski 90

grep、pgrep、egrep 和 fgrep 之间的差异 (Linux):

格雷普

grep 是一个首字母缩写词,代表“全局正则表达式打印”。grep 是一个程序,它逐行扫描一个或多个指定的文件,返回包含模式的行。模式是通过将字符解释为元字符来指定一组字符串的表达式。例如,星号元字符 (*) 被解释为表示“零个或多个前面的元素”。这使用户能够在 grep 命令中键入一系列简短的字符和元字符,让计算机向我们显示哪些文件匹配的行。

标准的 grep 命令如下所示:

grep <flags> '<regular expression>' <filename>
Run Code Online (Sandbox Code Playgroud)

grep 将搜索结果打印到屏幕 (stdout) 并返回以下退出值:

0    A match was found.
1    No match was found.
>1   A syntax error was found or a file was inaccessible 
     (even if matches were found).
Run Code Online (Sandbox Code Playgroud)

一些常见的标志是:-c用于计算成功匹配的数量而不打印实际匹配,-i使搜索不区分大小写,-n在每次匹配打印输出之前打印行号,-v取正则表达式的补码(即返回行不匹配),并-l打印具有与表达式匹配的行的文件的文件名。

埃格雷普

egrep 是一个首字母缩写词,代表“扩展全局正则表达式打印”。

egrep 中的“E”表示将模式视为正则表达式。在 egrep 中启用了缩写为“ERE”的“扩展正则表达式”。egrep的(其是相同的grep -E)治疗+?|(,和)作为元字符。

在基本的正则表达式(使用 grep)中,元字符?, +, {, |, (, 和)失去了它们的特殊含义。如果您希望 grep 将这些字符视为元字符,请转义它们 \?, \+, \{, \|, \(, 和\)

例如,这里的 grep 使用基本的正则表达式,其中加号按字面处理,返回任何带有加号的行。

grep "+" myfile.txt
Run Code Online (Sandbox Code Playgroud)

另一方面,egrep 将“+”视为元字符并返回每一行,因为加号被解释为“一次或多次”。

egrep "+" myfile.txt
Run Code Online (Sandbox Code Playgroud)

此处返回每一行,因为+egrep 将其视为元字符。正常的 grep 只会搜索带有文字的行+

fgrep

fgrep 是首字母缩写词,代表“固定字符串全局正则表达式打印”。

fgrep(与 grep -F 相同)是固定的或快速的 grep,其行为与 grep 相同,但不识别任何特殊的正则表达式元字符。搜索将完成得更快,因为它只处理简单的字符串而不是复杂的模式。

例如,如果我想在我的 .bash_profile 中搜索文字点 (.),那么使用 grep 会很困难,因为我必须转义点,因为点是元字符,表示“通配符,任何单个字符”:

grep "." myfile.txt
Run Code Online (Sandbox Code Playgroud)

上面的命令返回 myfile.txt 的每一行。改为这样做:

fgrep "." myfile.txt
Run Code Online (Sandbox Code Playgroud)

然后只有具有文字 '.' 的行 在他们返回。fgrep 帮助我们不必费心转义我们的元字符。

pgrep

pgrep 是首字母缩写词,代表“进程 ID 全局正则表达式打印”。

pgrep 查看当前运行的进程并列出与标准输出匹配的选择标准的进程 ID。当您只想知道进程的进程 ID 整数时,pgrep 很方便。例如,如果我只想知道我的 mysql 进程的进程 ID,我将使用pgrep mysql返回一个进程 ID(如 7312)的命令。