grep命令:Linux/Unix生态系统中一种强大的文本搜索工具,用以检索目标文本或者文件中是否包含给定的字串,并打印出所有匹配行。

grep这个命令其实起源于Linux/Unix系统中,文本编辑器ed中用以搜索文本的一个命令

g/re/p

Did you know?

The name, “grep”, derives from the command used to perform a similar operation, using the Unix/Linux text editor ed:
g/re/p

grep命令语法

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

文件搜索

$ grep boo /etc/passwd
示例输出
foo:x:1000:1000:foo,,,:/home/foo:/bin/ksh
忽略大小写
$ grep -i "boo" /etc/passwd

递归查找

$ grep -r "192.168.1.5" /etc/
或者
$ grep -R "192.168.1.5" /etc/
示例输出
/etc/ppp/options:# ms-wins 192.168.1.50
/etc/ppp/options:# ms-wins 192.168.1.51
/etc/NetworkManager/system-connections/Wired connection 1:addresses1=192.168.1.5;24;192.168.1.2;
在上面的例子中,包含关键词文件的文件名也会被列出来,你可以通过-h参数来过滤去掉文件名,这样输出结果会显得简洁许多
$ grep -h -R "192.168.1.5" /etc/
$ grep -hR "192.168.1.5" /etc/
示例输出
# ms-wins 192.168.1.50
# ms-wins 192.168.1.51
addresses1=192.168.1.5;24;192.168.1.2;

单词完全匹配

在上面的例子中,如果我们搜索boo,那么结果中很可能 fooboo, boo123, barfoo35或者一些别的符合条件的字符串都会匹配出来,如果我们只想匹配整个单词,那么你可以通过使用-w参数来实现。
$ grep -w "boo" file

同时检索两个不同的字符

使用egrep命令
$ egrep -w 'word1|word2' /path/to/file
计算匹配行
使用参数关键字-c(count)
$ grep -c 'word' /path/to/file
使用参数关键字-n返回行号
$ grep -n 'root' /etc/passwd
示例输出
1:root:x:0:0:root:/root:/bin/bash
1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh
3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh

反向匹配

参数关键字-v,返回不包含指定关键词
$ grep -v bar /path/to/file

Shell Pipes与grep

# dmesg | egrep '(s|h)d[a-z]'
# cat /proc/cpuinfo | grep -i 'Model'
当然了,上面的这些命令可以不通过Shell Pipes方式而是通过下面的命令实现
# grep -i 'Model' /proc/cpuinfo
示例输出
model       : 30
model name  : Intel(R) Core(TM) i7 CPU       Q 820  @ 1.73GHz
model       : 30
model name  : Intel(R) Core(TM) i7 CPU       Q 820  @ 1.73GHz

只列出符合条件的文件名

使用参数关键字-l
$ grep -l 'main' *.c
颜色标记关键字
$ grep --color vivek /etc/passwd