15 个对新手和专家都非常有用的 Linux Grep 命令示例

举报
Tiamo_T 发表于 2021/11/16 00:17:24 2021/11/16
【摘要】 在本文中,让我们了解15 个对新手和专家都非常有用的 Linux grep 命令的实际示例。

在本文中,让我们了解15 个对新手和专家都非常有用的 Linux grep 命令的实际示例。

首先创建以下 demo_file,将在下面的示例中用于演示 grep 命令。

$ cat demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.

Two lines above this line is empty.
And this is the last line.

1. 在单个文件中搜索给定的字符串

grep 命令的基本用法是在指定文件中搜索特定字符串,如下所示。

Syntax:
grep "literal_string" filename

$ grep "this" demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

2. 在多个文件中检查给定的字符串。

Syntax:
grep "string" FILE_PATTERN


这也是 grep 命令的基本用法。在本例中,让我们将 demo_file 复制到 demo_file1。grep 输出还将在与特定模式匹配的行前面包含文件名,如下所示。当 Linux shell 看到元字符时,它会进行扩展并将所有文件作为输入提供给 grep。

$ cp demo_file demo_file1

$ grep "this" demo_*
demo_file:this line is the 1st lower case line in this file.
demo_file:Two lines above this line is empty.
demo_file:And this is the last line.
demo_file1:this line is the 1st lower case line in this file.
demo_file1:Two lines above this line is empty.
demo_file1:And this is the last line.

3. 不区分大小写的搜索使用 grep -i

Syntax:
grep -i "string" FILE


这也是grep的基本用法。这不区分大小写地搜索给定的字符串/模式。因此,它不区分大小写地匹配所有单词,例如“the”、“THE”和“The”,如下所示。


$ grep -i "the" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
And this is the last line.

4. 匹配文件中的正则表达式

Syntax:
grep "REGEX" filename


这是一个非常强大的功能,如果您可以有效地使用正则表达式。在下面的示例中,它搜索所有以“lines”开头并以“empty”结尾的模式,以及中间的任何内容。即在 demo_file 中搜索“lines[anything in-between]empty”。

$ grep "lines.*empty" demo_file
Two lines above this line is empty.

来自 grep 的文档:正则表达式后面可以跟几个重复运算符之一:

  • ? 前一项是可选的,最多匹配一次。
  • * 前面的项目将匹配零次或多次。
  • + 前一项将匹配一次或多次。
  • {n} 前一项正好匹配 n 次。
  • {n,} 前一项被匹配 n 次或更多次。
  • {,m} 前一项最多匹配 m 次。
  • {n,m} 前一项至少匹配 n 次,但不超过 m 次。

5. 使用 grep -w 检查完整的单词,而不是子字符串

如果您想搜索一个词,并避免它与子字符串匹配,请使用 -w 选项。只需进行正常搜索即可显示所有行。

以下示例是常规 grep,它在其中搜索“is”。当您搜索“is”时,如果没有任何选项,它将显示“is”、“his”、“this”以及所有包含子字符串“is”的内容。

$ grep -i "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
Two lines above this line is empty.
And this is the last line.


以下示例是 WORD grep,它仅搜索单词“is”。请注意,此输出不包含“This Line Has All its First Character Of The Word With Big Case”这一行,即使“This”中有“is”,因为以下仅查找单词“is” ”而不是“这个”。

$ grep -iw "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

6. 使用 grep -A、-B 和 -C 显示比赛前/后/周围的行

在对大文件执行 grep 时,在匹配后查看一些行可能很有用。如果 grep 不仅可以显示匹配行,还可以显示匹配之后/之前/周围的行,您可能会觉得很方便。


请为此示例创建以下 demo_text 文件。

$ cat demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

 * e - go to the end of the current word.
 * E - go to the end of the current WORD.
 * b - go to the previous (before) word.
 * B - go to the previous (before) WORD.
 * w - go to the next word.
 * W - go to the next WORD.

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

 * 192.168.1.1 - single WORD
 * 192.168.1.1 - seven words.

6.1 匹配后显示N行

-A 是在匹配后打印指定的 N 行的选项,如下所示。

Syntax:
grep -A <N> "string" FILENAME


以下示例打印匹配的行及其后的 3 行。

$ grep -A 3 -i "example" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

6.2 匹配前显示N行

-B 是在匹配之前打印指定的 N 行的选项。

Syntax:
grep -B <N> "string" FILENAME


当您可以选择在匹配后显示 N 行时,您可以使用 -B 选项。

$ grep -B 2 "single WORD" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

6.3 在比赛周围显示 N 行

-C 是在匹配之前打印指定的 N 行的选项。在某些情况下,您可能希望匹配显示为两侧的线条。此选项在匹配的两侧(之前和之后)显示 N 行。

$ grep -C 2 "Example" demo_text
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

7. 使用 GREP_OPTIONS 突出显示搜索

由于 grep 通过您提供的模式/字符串从文件中打印出行,如果您希望它突出显示与该行匹配的部分,那么您需要按照以下方式进行操作。

当您执行以下导出时,您将突出显示匹配的搜索。在以下示例中,当您设置 GREP_OPTIONS 环境变量时,它将突出显示所有这些,如下所示。

$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'

$ grep this demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

8.使用grep -r递归搜索所有文件

当您要搜索当前目录及其子目录下的所有文件时。-r 选项是您需要使用的选项。以下示例将在当前目录及其所有子目录中的所有文件中查找字符串“ramesh”。

$ grep -r "ramesh" *

9. 使用 grep -v 反转匹配

您有不同的选项来显示匹配的行、显示匹配前的行、显示匹配后的行以及突出显示匹配。因此,您肯定还希望选项 -v 进行反转匹配。

如果要显示与给定字符串/模式不匹配的行,请使用选项 -v,如下所示。此示例将显示与单词“go”不匹配的所有行。

$ grep -v "go" demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

10.显示不匹配所有给定模式的行。

Syntax:
grep -v -e "pattern" -e "pattern"

$ cat test-file.txt
a
b
c
d

$ grep -v -e "a" -e "b" -e "c" test-file.txt
d

11.使用grep -c计算匹配的数量

当您想计算与给定模式/字符串匹配的行数时,请使用选项 -c。

Syntax:
grep -c "pattern" filename

$ grep -c "go" demo_text
6


当你想找出多少行与模式匹配时

$ grep -c this demo_file
3


当您想要找出与模式不匹配的行数时

$ grep -v -c this demo_file
4

12. 使用 grep -l 仅显示与给定模式匹配的文件名

如果您希望 grep 仅显示与给定模式匹配的文件名,请使用 -l(小写 L)选项。

当您将多个文件作为输入提供给 grep 时,它会显示包含与模式匹配的文本的文件名,当您尝试在整个目录结构中查找一些注释时会非常方便。

$ grep -l this demo_*
demo_file
demo_file1

13.只显示匹配的字符串

默认情况下,grep 将显示与给定模式/字符串匹配的行,但如果您希望 grep 仅显示模式的匹配字符串,请使用 -o 选项。

当您直接给出字符串时,它可能没有那么有用。但是当您提供正则表达式模式并尝试查看它匹配的内容时,它变得非常有用

$ grep -o "is.*line" demo_file
is line is the 1st lower case line
is line
is is the last line

14.显示匹配在行中的位置

当您希望 grep 显示与文件中的模式匹配的位置时,请使用以下选项作为

Syntax:
grep -o -b "pattern" file

$ cat temp-file.txt
12345
12345

$ grep -o -b "3" temp-file.txt
2:3
8:3


注意:上面grep命令的输出不是行中的位置,而是整个文件的字节偏移量。

15.使用grep -n显示输出时显示行号

显示与行匹配的文件的行号。它对每个文件进行基于 1 的行编号。使用 -n 选项来利用此功能。

$ grep -n "go" demo_text
5: * e - go to the end of the current word.
6: * E - go to the end of the current WORD.
7: * b - go to the previous (before) word.
8: * B - go to the previous (before) WORD.
9: * w - go to the next word.
10: * W - go to the next WORD.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。