Skip to content

Linux三剑客之grep

Linux 三剑客之 grep

简介

grep是一个在 Linux 操作系统中用于文本搜索的强大命令行工具,它吣在文件或输出中查找匹配的文本模式,并提供多种选项来控制搜索的行为和输出格式

grep 的应用

  • 搜索文件中的特定文本
  • 递归搜索目录中的文件
  • 过滤和显示匹配的行
  • 结合其他命令进行更复杂的搜索和过滤

优点

  • 强大灵活:支持基本和扩展正则表达式,可以处理复杂的搜索模式。
  • 高效:能够快速处理大文件和目录。
  • 多平台支持:几乎所有类 Unix 操作系统都内置了 grep命令。

语法

grep [options] pattern [files]
  • pattern:要搜索的文本模式,可以是字符串或正则表达式。
  • files:要搜索的文件或文件列表,可以同时查找多个文件。

如果省略 files 参数,则默认从标准输入中读取数据。

常用选项

  • -i:忽略大小写(重点)
  • -v:显示不匹配的行(重点)
  • -c:显示匹配的行数(重点)
  • -l:只显示包含匹配文本的文件名
  • -L:只显示不包含匹配文本的文件名
  • -n:显示匹配行的行号(重点)
  • -H:显示匹配文本所在的文件名
  • -r:递归搜索目录
  • -w:只匹配整个单词
  • -x:只匹配整个行

内容检索

获取行

使用 grep 命令可以从文件中检索包含特定数据的行。

语法
grep pattern file
  • pattern:要搜索的字符串或正则表达式。
  • file:要搜索的目标文件。
示例

假设有一个文件 example.txt,内容如下,使用 grep 显示文件中匹配hogwarts的行:

my name is hogwarts
hello hogwart
hogwarts is good
  • 命令
grep "hogwarts" example.txt
  • 结果
my name is hogwarts name
hogwarts is good

获取内容

使用 -o 选项只显示匹配的部分,而不是整行。

语法
grep -o pattern file
  • -o:只显示匹配的部分。
示例

仅显示文件 example.txt 中匹配 hogwarts 的内容。

  • 命令
grep -o "hogwarts" example.txt
  • 结果
hogwarts
hogwarts

获取上下文(重点)

使用 -A-B-C 选项可以显示匹配行的上下文行数。

在调试日志文件或分析长文本文档时尤其有用。

语法
grep -A num pattern file
grep -B num pattern file
grep -C num pattern file
  • -A num:显示匹配行后面的num行。
  • -B num:显示匹配行前面的num行。
  • -C num:显示匹配行前后各num行。
示例

假设 example.txt文件内容如下:

line 1: This is the first line.
line 2: This is the second line.
line 3: This line contains the pattern.
line 4: This is the fourth line.
line 5: This is the fifth line.
显示匹配pattern后面的 1 行。
grep -A 1 "pattern" example.txt
  • 输出
line 3: This line contains the pattern.
line 4: This is the fourth line.
  • 表示显示匹配行及之后的 1 行,也就是 line 3、line 4。
显示匹配行之前的行
grep -B 1 pattern example.txt
  • 输出
line 2: This is the second line.
line 3: This line contains the pattern.
  • 表示显示匹配行及之前的 1 行,也就是 line2、line3。
显示匹配行前后的行
grep -C 1 "pattern" example.txt
  • 输出
line 2: This is the second line.
line 3: This line contains the pattern.
line 4: This is the fourth line.
  • 表示显示匹配行及前后各 1 行。

文件检索

递归搜索

使用 -r 选项可以在目录中递归搜索。

语法
grep pattern -r dir/
  • pattern:要搜索的字符串或正则表达式。
  • -r:递归搜索目录及其子目录。
  • dir/:要搜索的目录。
示例

/path整个目录树中查找包含 "search_term" 的文件内容

grep "search_term" -r /path/

展示匹配文件名

使用 -H 选项显示包含匹配内容的文件名和内容。

语法
grep -H pattern file
  • -H:显示匹配的文件名。在显示符合样式的那一行之前,显示该行所属的文件名称。
示例

example.txt中查找"line"的内容并显示文件名

grep -H "line" example.txt

只展示匹配文件名

使用 -l选项只显示包含匹配内容的文件名。

语法
grep -l pattern file
  • -l:只显示包含匹配内容的文件名。
示例

想在文件/tmp/1中查找包含111的内容,并且只显示文件名

grep -l "111" /tmp/1

案例

有一个目录 /logs 其中包含多个日志文件,找到所有包含 ERROR 的日志文件的文件名。

grep -l "ERROR" -r /logs

范围约束(重点)

忽略大小写

使用 -i 选项忽略大小写进行搜索。

语法
grep -i pattern file
  • -i:忽略大小写。
示例

在文件 example.txt中查找包含"apple"(忽略大小写)的内容。

grep -i "apple" example.txt

不显示匹配的行(重点)

使用 -v 选项显示不包含匹配内容的行。

语法
grep -v pattern file
  • -v:反向匹配,即显示不包含匹配内容的行。
示例

在文件 example.txt中查找不包含"apple"的行。

grep -v "apple" example.txt

使用扩展正则表达式

使用 -E 选项启用扩展正则表达式。

语法
grep -E pattern file
  • -E:启用扩展正则表达式。
示例

在文件example.txt中查找包含"apple"或"banana"的行。

grep -E "apple|banana" example.txt

会在example.txt文件中查找所有包含"apple"和"banana"的行,并显示这些行。

文件范围和目录范围约束

使用--include选项限制搜索范围。

语法
grep pattern -r dir/ --include "pattern"
  • --incluede "pattern":指定文件名模式,只有匹配该模式的文件才会被搜索。

pattern可以使用通配符,例如:

  • *.txt:匹配所有以.txt结尾的文件。
  • file*:匹配所有以file开头的文件。
  • *log*:匹配所有包含log的文件名。
示例

有一个目录/project,其中包含多个文件和子目录。现要查找文件名以"log"开关的文件中查找"ERROR"。

grep "ERROR" -r /project --include "log*"

通过 --include 选项来限制grep命令的搜索范围,提高搜索效率。

进程检索(重点)

进程过滤

使用grep命令可以过滤进程列表,但需要注意过滤掉grep本身的进程。

语法
ps -ef | grep pattern | grep -v grep
  • ps -ef:列出系统中所有正在支行的进程。
  • grep pattern:从进程列表中过滤出包含特定模式的行。
  • grep -v grep:过滤掉包含grep命令本身的行。
示例

查看系统中所有包含 ssh 的进程

ps -ef | grep ssh

为了去除grep本身的进程,可以使用:

ps-ef | grep ssh | grep -v grep

总结

  • 简介
  • grep 的应用
  • 优点
  • 语法
  • 内容检索
  • 文件检索
  • 范围约束
  • 进程检索