高效能程序工具之grep

本文详细介绍了grep命令的功能及其各种变体,包括egrep、fgrep和rgrep,并提供了grep命令的常见选项说明及实际应用场景示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep是global regular expression pattern,意思是全局正则表达模式匹配。通俗来讲就是用于模式匹配,或者叫做查找。它有几个变体:

  • egrep ---- 相当于grep -e
  • fgrep ---- 相当于grep -f
  • rgrep ---- 相当于grep -r

这几个不是很常用,已经是Deprecated,建议还是用grep。

命令格式

grep [options] [-e|--regexp PATTERN] PATTERN FILEs

例如:
grep -rin --color -E -e "task" -e "run" RunOrStart.java

常用选项

  • -i 忽略大小写
  • -r 递归式的处理子目录
  • -n 输出时带有与模式相匹配的行号
  • -w 仅匹配整个单词,相当于\bPATTERN\b
  • -e 指定一个模式
  • -E 用扩展正则表达式
  • -x 匹配一整行,相当于^PATTERN$
  • -I 忽略二进制文件
  • --color 输出时用颜色来高亮显示匹配的模式

因为某些选项特别的常用,所以可以用alias来改造grep,让其变成默认选项:
alias grep="grep -rnEI --color"
解释:

-r 99%的情况下是肯定要查询子目录的。
-n 输出时带有行号可以方便后面的操作。
--color 高亮输出,方便查看
-I 多数情况下,都是处理纯文本(代码,Makefile,config file),所以要忽略二进制文件,就不会出现如下的输出:

alex:~$ grep shell * Binary file libwebcore.so matches

-E 因为默认情况下是用BRE(Basic Regular Expression),某些操作符如|(alternate), +(one or more repetition)无效,如:
grep "task|run" * (no matches)

grep "task|run" * (no matches) grep "tas\w+r" * (no matches)

用-E来使用ERE(Extended Regular Expression)就可以使用这此:

alex:~/work/java$ grep -E "task|run" * RunOrStart.java: public void run() { RunOrStart.java: System.out.println("TestRun.run(), start running are you aware of that" + name); RunOrStart.java: System.out.println("TestRun.run(), end running" + name); RunOrStart.java: public void run() { RunOrStart.java: System.out.println("TastStart.run(), start running are you aware of that" + name); RunOrStart.java: System.out.println("TastStart.run(), end running" + name); RunOrStart.java: new TaskRun("taskrun").run(); RunOrStart.java: System.out.println("taskrun is ending"); RunOrStart.java: new TaskStart("with run").run(); RunOrStart.java: System.out.println("taskstart.run is ending"); alex:~/work/java$ grep -E "tas\w+r" * RunOrStart.java: new TaskRun("taskrun").run(); RunOrStart.java: System.out.println("taskrun is ending"); RunOrStart.java: System.out.println("taskstart.run is ending");

关于引号的使用quoted pattern

先来看二个例子:

alex:~/work/java$ grep tas\w*r *(no outputs) alex:~/work/java$ grep "tas\w*r" * RunOrStart.java: new TaskRun("taskrun").run(); RunOrStart.java: System.out.println("taskrun is ending"); RunOrStart.java: System.out.println("taskstart.run is ending");

对于grep的参数PATTERN是一定要用引号的,单引双引均可,以防止Shell对某些具有特殊意义的字符进行扩展,如&,\,|等,如不加引号会变成后台运行,转义和管道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值