带行号的 Grep

要显示包含字符串的行号,请使用 -n 开关:

$ grep -n string filename

使用正则表达式grep

通过使用正则表达式进一步扩展了 Grep 的功能,使搜索更加灵活。

[ ] 括号用于匹配任何一组字符。

$ grep "Class [123]" Students.txt

此命令将返回任何表示“Class 1”、“Class2”或者“Class 3”的行。

[-] 带连字符的括号可用于指定字符,数字或者字母的范围。

$ grep "Class [1-3]" Students.txt

^ 插入符号用于搜索仅出现在行首的模式。

$ grep "^Class" Students.txt

[^] 带插入符号的括号用于从搜索模式中排除字符。

$ grep "Class [^1-2]" Students.txt

$ 美元符号用于搜索仅出现在行尾的模式。

$ grep "1$" Students.txt

. 点号 用于匹配任何一个字符,因此它是一个通配符,但仅适用于单个字符。

$ grep "A….a" Students.txt

或者条件

搜索string1或者string2

$ grep -E 'string1|string2' filename
$ egrep 'string1|string2' filename
Linux Grep命令示例

Grep 是 Linux 用户用来搜索文本字符串的命令行工具。

查找多个字符串

我们还可以使用 grep 查找多个单词或者字符串。
使用-e开关指定多模式搜索

$ grep -e 'Class 1' -e Todd Students.txt

只需要在包含空格的字符串中使用引号。

排除模式

我们可以使用 -v 开关 排除匹配的行。

$ grep -v string-to-exclude filename

Grep 精确匹配

在上面的示例中,每当我们在文档中搜索字符串“apple”时,grep 也会返回“pineapple”分。
为了避免这种情况,并严格搜索“apple”,我们可以使用以下命令:

$ grep "\<apple\>" fruits.txt

我们还可以使用 -w 开关,它会告诉 grep 字符串必须匹配整行。

不解压,直接搜索gz文件

我们可以使用 zgrep 命令搜索压缩文件,而无需先解压缩它们。

$ zgrep word-to-search /path/to/file.gz

我们还可以使用 zcat 命令显示 gz 文件的内容,然后将该输出通过管道传送到 grep 以隔离包含搜索字符串的行。

$ zcat file.gz | grep word-to-search

递归搜索

我们可以将 -r 开关与 grep 一起使用,以递归方式搜索目录及其子目录中的所有文件以查找指定模式。

$ grep -r pattern /directory/to/search

如果我们不指定目录,grep 将只搜索我们当前的工作目录。

Grep 电子邮件地址

我们可以使用正则表达式从 zip 文件中提取所有电子邮件地址。

$ grep -o '[[:alnum:]+\._\-]*@[[:alnum:]+\._\-]*' emails.txt

-o 标志将仅提取电子邮件地址,而不是显示包含电子邮件地址的整行。
这会导致更清晰的输出。

查找字符串

搜索My Documents文件

$ ls | grep 'My Documents'

如果字符串包含空格,需要使用引号引起来, Grep 接受单引号和双引号。

搜索文件内容中的字符串:

$ grep 'Class 1' Students.txt

Grep IP 地址

以下命令将仅查找并隔离有效的 IPv4 地址:

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log

忽略大小写

默认情况下,grep 区分大小写,这意味着我们必须精确地确定搜索字符串的大小写。
我们可以通过使用 -i 开关告诉 grep 忽略大小写 。

$ grep -i string filename

显示前后行

如果我们需要更多关于 grep 输出的上下文,我们可以使用 -c 开关在指定的搜索字符串前后显示一行:

$ grep -c 1 string filename

grep、egrep fgrep、pgrep、zgrep的区别

egrep 相当于 grep -E

设置为扩展正则表达式模式。

搜索包含两个连续“p”字母的字符串

$ egrep p\{2} fruits.txt

或者

$ grep -E p\{2} fruits.txt

fgrep 相当于 grep -F

此开关将模式解释为固定字符串的列表,并尝试匹配其中任何一个字符串。当您需要搜索正则表达式字符时,它非常有用。这意味着你不必像普通grep那样转义特殊字符。

pgrep

pgrep是一个命令,用于搜索系统上正在运行的进程的名称并返回其各自的进程ID。例如,您可以使用它来查找SSH守护进程的进程ID:

$ pgrep sshd

类似于将“ps”命令的输出通过管道传递给 grep。

zgrep

您可以使用 zgrep 搜索压缩文件中的模式。 它允许您搜索压缩档案中的文件,而无需先解压缩该档案,基本上可以节省一两个另外的步骤。

$ zgrep apple fruits.txt.gz

zgrep 也适用于 tar 文件,但似乎只能告诉我们它是否能够找到匹配项。

find 和 grep 的区别

当我们使用 grep 搜索 ls 命令的输出时,使用 grep 查找文件很方便

但是,如果我们需要递归搜索文件名——或者如果使用通配符(星号)搜索文件名的一部分——那么使用“find”命令就更容易了。

$ find /path/to/search -name name-of-file

find 命令能够成功定位到我们搜索的文件。

捕获空格或者制表符

在引号内放置一个或者多个空格,以便 grep 搜索该字符。

$ grep " " sample.txt

搜索制表符最简单的方法,是使用ctrl+v从其他地方粘贴tab制表符:

$ grep "    " sample.txt
日期:2020-07-15 11:16:43 来源:oir作者:oir