在日常的 Linux 系统管理和开发工作中,经常会遇到需要搜索特定文本内容的情况。这时,grep(global regular expression print)就是一个非常强大而实用的命令行工具。本文将介绍 grep 的基本用法以及一些高级技巧
介绍
grep 是一种强大的文本搜索工具,可以在文件中查找符合指定模式的文本行,并将其打印出来。它支持使用正则表达式进行模式匹配,因此能够灵活、高效地实现各种文本搜索需求
命令格式:
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
-i 选项可以忽略大小写进行搜索,使搜索更加灵活。
-n 项可以显示匹配行的行号,方便快速定位。
-r 项可以递归地搜索指定目录及其子目录下的所有文件。
-E 选项启用扩展正则表达式功能。可以使用更多的正则表达式语法。
使用示例:
// 匹配指定内容, 终端输出行会有颜色高亮
➜linuxtest cat test1.txt
justx
第一行文字
第二行文字
第三行蚊子 // 特地写错一个
➜linuxtest grep 文字 test1.txt
第一行文字
第二行文字
// 多个文件
➜linuxtest grep 文字 test1.txt test2.txt test3.txt
test1.txt:第一行文字
test1.txt:第二行文字
test3.txt: 4 第一行文字
test3.txt: 6 第二行文字
// 显示匹配行的行号
➜linuxtest grep 文字 -n test1.txt test2.txt test3.txt
test1.txt:4:第一行文字
test1.txt:6:第二行文字
test3.txt:4: 4 第一行文字
test3.txt:6: 6 第二行文字
// 递归搜索目录下所有文件
➜~ grep 文字 -r linuxtest
linuxtest/test1.txt:第一行文字
linuxtest/test1.txt:第二行文字
linuxtest/test3.txt: 4 第一行文字
linuxtest/test3.txt: 6 第二行文字
// 基础正则 // 以 第 开头的行
➜~ grep ^第 -r linuxtest
linuxtest/test1.txt:第一行文字
linuxtest/test1.txt:第二行文字
linuxtest/test1.txt:第三行蚊子
// 以 蚊子 结尾的行
➜~ grep 蚊子$ -r linuxtest
linuxtest/test1.txt:第三行蚊子
linuxtest/test3.txt: 8 第三行蚊子
// 扩展正则
➜~ grep -E "文字|蚊子" -r linuxtest
linuxtest/test1.txt:第一行文字
linuxtest/test1.txt:第二行文字
linuxtest/test1.txt:第三行蚊子
linuxtest/test3.txt: 4 第一行文字
linuxtest/test3.txt: 6 第二行文字
linuxtest/test3.txt: 8 第三行蚊子
grep
命令默认使用基本正则表达式(BRE)语法,不加 -E
选项时,正则表达式语句的写法需要符合BRE语法。BRE语法和扩展正则表达式(ERE)语法有一些区别,下面是一些例子:
- 匹配字符
- 在BRE中,
.
匹配除了换行符外的任意单个字符。在ERE中,.
匹配任意单个字符。 - 在BRE中,
\
可以转义特殊字符,比如\|
表示|
字符。在ERE中,\
不是元字符,因此不能用来转义特殊字符。
- 在BRE中,
- 匹配重复字符
- 在BRE中,
*
表示匹配前一个字符 0 到多次。在ERE中,*
表示匹配前一个字符 0 到多次,与BRE相同。 - 在BRE中,
+
表示匹配前一个字符 1 到多次,但在ERE中表示的是匹配前一个字符 1 到多次。
- 在BRE中,
- 匹配字符组
- 在BRE中,字符组用方括号
[]
表示。例如,[abc]
表示匹配 a、b 或 c。在ERE中,字符组也用方括号表示,但它支持更多的表达式,如[a-z]
表示匹配 a 到 z 中的任意一个字符。
- 在BRE中,字符组用方括号
如果使用 -E
选项,可以启用扩展正则表达式的语法,这时候正则表达式中的元字符会被解释成扩展正则表达式的语法。由于扩展正则表达式的语法更加丰富,因此可以用更少的字符来实现更多的功能,例如使用|
表示或者使用()
进行分组等等。
文章评论