菜鸟科技网

grep命令用法有哪些核心技巧?

下面我将从基础到高级,全面地介绍 grep 命令的用法。

grep命令用法有哪些核心技巧?-图1
(图片来源网络,侵删)

基础用法

grep 的基本功能是在文件中搜索匹配的行,并将其打印到标准输出。

基本语法

grep [选项] '模式' 文件...
  • 选项:用于控制 grep 的行为。
  • 模式:你想要搜索的字符串或正则表达式。
  • 文件:一个或多个要搜索的文件名。

最简单的例子

file.txt 文件中搜索包含 "hello" 的行。

grep 'hello' file.txt

区分大小写

默认情况下,grep 是区分大小写的。

# 只会匹配小写的 'world'
grep 'world' file.txt

不区分大小写

使用 -i 选项可以忽略大小写。

grep命令用法有哪些核心技巧?-图2
(图片来源网络,侵删)
# 会匹配 'World', 'WORLD', 'world' 等
grep -i 'world' file.txt

显示行号

使用 -n 选项可以在输出的每一行前面加上其在文件中的行号。

grep -n 'hello' file.txt

输出示例:

5:This is a hello world example.
10:Say hello to everyone.

显示匹配行之外的所有行

使用 -v 选项可以反转查找,即输出不包含匹配模式的行。

# 显示 file.txt 中所有不包含 'hello' 的行
grep -v 'hello' file.txt

进阶用法

递归搜索目录

使用 -r-R 选项可以递归地搜索指定目录下的所有文件。

grep命令用法有哪些核心技巧?-图3
(图片来源网络,侵删)
# 在当前目录及其子目录的所有文件中搜索 'error'
grep -r 'error' .

只显示文件名

当使用 -r 递归搜索多个文件时,默认会显示 文件名:匹配行,如果你只想显示包含匹配模式的文件名,可以使用 -l 选项。

# 只显示包含 'error' 的文件名
grep -r -l 'error' .

使用正则表达式

grep 默认支持基础正则表达式,元字符(如 ^, , 等)有特殊含义。

  • ^:匹配行的开头。
  • 匹配行的结尾。
  • 匹配任意单个字符。
  • 匹配前一个字符零次或多次。
  • []:匹配指定范围内的任意一个字符。

示例:

# 搜索所有以 "The" 开头的行
grep '^The' file.txt
# 搜索所有以 "end." 结尾的行
grep 'end\.$' file.txt
# 搜索包含 "gr[ae]y" 的行 (即 gray 或 grey)
grep 'gr[ae]y' file.txt

使用扩展正则表达式

使用 -E 选项可以启用扩展正则表达式,它支持更多的元字符,如 , , , 等,并且不需要对 进行转义。

  • 匹配前一个字符一次或多次。
  • 匹配前一个字符零次或一次。
  • 匹配 两边的任意一个表达式。
  • 分组。

示例:

# 搜索包含 "apple" 或 "orange" 的行 (基础正则表达式需要用 grep -E 'apple\|orange')
grep -E 'apple|orange' file.txt
# 搜索包含 "colou?r" 的行 (即 color 或 colour)
grep -E 'colou?r' file.txt

显示匹配次数

使用 -c 选项可以统计每个文件中匹配行的总数。

# 统计 file.txt 中包含 'hello' 的行数
grep -c 'hello' file.txt

只显示匹配的文本部分

使用 -o 选项可以只打印匹配到的部分,而不是整行。

# 只打印出所有匹配 'go+' 的部分
echo "I go to school, going to play." | grep -o 'go+'

输出:

go
going
go

高级用法与技巧

排除特定文件

结合 --exclude--exclude-dir 选项,可以在搜索时排除特定文件或目录。

# 递归搜索,但排除所有 .log 文件和 .git 目录
grep -r 'search_term' . --exclude='*.log' --exclude-dir='.git'

使用固定字符串模式

如果你搜索的字符串中包含很多正则表达式元字符(如 , , ),而你只想把它们当作普通字符来搜索,可以使用 -F 选项(Fixed strings)。

# 'file*' 中的 '*' 会被当作普通星号,而不是正则表达式的通配符
grep -F 'file*' file.txt

显示匹配前后的行

  • -B <num>:显示匹配行之前的 num 行(Before)。
  • -A <num>:显示匹配行之后的 num 行(After)。
  • -C <num>:显示匹配行前后的各 num 行(Context)。

这在查看日志时非常有用。

# 搜索 'error',并显示匹配行及其前后2行的内容
grep -C 2 'error' app.log

使用颜色高亮

使用 --color=auto 选项(很多系统 grep 默认已开启)可以用颜色高亮显示匹配的文本。

grep --color=auto 'error' app.log

匹配整词

使用 -w 选项可以确保匹配的是完整的单词,而不是单词的一部分。

# 只会匹配 'the',不会匹配 'then' 或 'weather'
grep -w 'the' file.txt

通过管道传递数据

grep 的一个强大之处在于它可以从其他命令的输出中读取数据(通过管道符 )。

# 列出当前目录下所有以 'txt' 结尾的文件
ls -l | grep 'txt$'
# 查看系统启动过程中的错误信息
dmesg | grep -i 'error'

常用选项速查表

选项 全称 说明
-i --ignore-case 忽略大小写进行搜索。
-v --invert-match 反转查找,只显示不匹配的行。
-n --line-number 在输出中显示匹配行的行号。
-c --count 只输出每个文件中匹配行的总数。
-l --files-with-matches 只列出包含匹配项的文件名。
-L --files-without-match 只列出不包含匹配项的文件名。
-h --no-filename 在多文件搜索时,不显示文件名前缀。
-r / -R --recursive 递归搜索目录下的所有文件。
-E --extended-regexp 使用扩展正则表达式。
-F --fixed-strings 将模式视为固定字符串(非正则表达式)。
-P --perl-regexp 使用 Perl 兼容的正则表达式。
-o --only-matching 只打印匹配到的部分。
-f --file=FILE 从文件中读取模式列表,每行一个模式。
-q --quiet, --silent 静默模式,不输出任何内容,通过退出状态码表示是否找到。
-w --word-regexp 只匹配整个单词。
-x --line-regexp 只匹配整行完全相同的行。
-B --before-context=NUM 显示匹配行之前的 NUM 行。
-A --after-context=NUM 显示匹配行之后的 NUM 行。
-C --context=NUM 显示匹配行前后的各 NUM 行。
--color --colour=WHEN 用颜色高亮匹配文本。auto 表示自动。

grep 是一个极其灵活的工具,掌握它的基本用法和常用选项,能极大地提高你在命令行下处理文本的效率,建议从 -i, -n, -v, -r 等基础选项开始练习,然后逐步学习正则表达式和更高级的上下文搜索功能。

分享:
扫描分享到社交APP
上一篇
下一篇