grepgrep入门


备注

grep打印包含文件中模式匹配的行。

grep可以使用正则表达式,并有几个选项来提高结果的质量。

参考

版本

POSIX grep

发布日期
POSIX.2 1992-01-01
IEEE Std 1003.1-2001 2001-12-06
IEEE Std 1003.1,2004版 2004-01-01
IEEE Std 1003.1,2013 Edition 2013年4月19日
IEEE Std 1003.1,2016版 2016年9月30日

Illumos / OpenSolaris grep

发布日期
2005-06-14 2005-06-14
2005-09-06 2005-09-06
2012-03-30 2012-03-30
2012年9月17日 2012年9月17日
2013年5月14日 2013年5月14日

GNU grep

发布日期
2.0 1996-10-01
2.2 1998年4月27日
2.3 1999年2月14日
2.4.1 2000-03-01
2.4.2 2000年3月9日
2.4 1999年12月3日
2.5.1 2004-10-29
2.5.1a 2004-11-19
2.5.3 2007-08-02
2.5.4 2009-02-09
2.5 2002-03-13
2.6.1 2010-03-25
2.6.2 2010-03-29
2.6.3 2010-04-02
2.6 2010-03-23
2.7 2010-09-20
2.8 2011-05-13
2.9 2011-06-21
2.10 2011-11-16
2.11 2012-03-02
2.12 2012-04-23
2.13 2012-07-04
2.14 2012-08-20
2.15 2013年10月26日
2.16 2014年1月1日
2.17 2014年2月17日
2.18 2014年2月20日
2.19 2014年5月22日
2.20 2014年6月3日
2.21 2014年11月23日
2.22 2015年11月1日
2.23 2016年2月4日
2.24 2016年3月10日
2.25 2016年4月21日
2.26 2016年10月2日
2.27 2016年12月6日
2.28 2017年2月6日

BSD grep / FreeGrep

发布日期
OpenBSD 3.0 2001-12-01
OpenBSD 3.4 2003-11-01
OpenBSD 3.5 2004-05-01
OpenBSD 3.6 2004-11-01
OpenBSD 3.7 2005-05-19
OpenBSD 3.8 2005-11-01
OpenBSD 3.9 2006-05-01
OpenBSD 4.0 2006-11-01
OpenBSD 4.1 2007-05-01
OpenBSD 4.3 2008-05-01
OpenBSD 4.8 2010-11-01
OpenBSD 5.0 2011-11-01
OpenBSD 5.3 2013年5月1日
OpenBSD 5.7 2015年5月1日
OpenBSD 5.8 2015年10月18日
OpenBSD 5.9 2016年3月29日
NetBSD 2.0 2004-12-09
NetBSD 4.0 2007-12-19
NetBSD 6.0 2012年10月17日
NetBSD 7.0 2015年9月25日
FreeBSD 9.0 2012-01-02
FreeBSD 10.0 2014年1月16日

基本用法

运行命令:

grep sam someFile.txt
 

someFile.txt 包含:

fred 14 m foo
sam 68 m bar
christina 83 f baz
bob 22 m qux
Sam 41 m quux
 

会产生这样的输出:

sam 68 m bar
 

以递归方式查找给定目录中的文本

使用GNU grep

grep -r 'pattern' <directory path>
 

要列出匹配的行号,请使用-n 选项

grep -rn 'pattern' <directory path>
 

仅搜索具有特定glob模式的文件

grep --include='*.txt' -r 'pattern' <directory path>
 

排除文件模式或目录

grep -R --exclude=*.log 'pattern' <directory path>
grep -R --exclude={*.log,*.class} 'pattern' <directory path>

grep -R --exclude-dir=tmp 'pattern' <directory path>
grep -R --exclude-dir={tmp,lib} 'pattern' <directory path>
 

备注和其他有用的选项

  • 如果在当前目录中搜索,则可以跳过<directory path>
  • -R 选项遵循所有符号链接,与-r 不同,它仅在符号链接位于命令行之后
  • -l 仅列出匹配的文件
  • -h 抑制文件名前缀
  • --color=auto 以突出显示匹配的模式
  • -m <num> 指定每个文件输入的最大匹配数

POSIX解决方法以递归方式搜索

find <directory path> -type f -exec grep -l 'pattern' {} +
 
  • 可以根据需要使用-n-l 等选项
  • 如果不支持{} + ,请使用{} \; 代替
  • 找到文档上更多的帮助find 怎么样,包括命令/排除的文件类型,目录等

Grep上下文控制

给定一个名为movieslist的文件Sample。

Troy
Gladiator
Robin Hood
King Arthur
BraveHeart
The Last Samurai
 

正常的grep返回

grep "Gladiator" movieslist
Gladiator
 

现在,使用grep打印文件的下方或上方行。

打印以下行

grep -A 1 Gladiator movieslist 
Gladiator
Robin Hood
 

打印上面的行

grep -B 1 Gladiator movieslist 
Troy
Gladiator
 

打印两者

grep -C 1 Gladiator movieslist 
Troy
Gladiator
Robin Hood
 

忽略大小写

给定文件sample

hello
Hello
HELLO_there
 

“hello”的正常grep 返回:

$ grep "hello" sample 
hello
 

使用-i 允许忽略大小写并匹配任何“hello”:

$ grep -i "hello" sample
hello
Hello
HELLO_there
 

匹配整个单词

给定文件sample

hello world
ahello here
hello_there
 

“hello”的正常grep 返回:

$ grep hello sample 
hello world
ahello here
hello_there
 

使用-w 允许选择包含构成整个单词的匹配的行:

$ grep -w hello sample 
hello world
 

仅打印行的匹配部分

echo "Prints only the matching part of the lines" | grep -o "matching"
# prints matching