grep(global regular expression print,全局正则表达式打印)命令作为Unix中用于文本搜索的神奇工具,能够接受正则表达式,生成各种的输出,如文本行的输出、正则所匹配的文本文件,经常用来定位具体文本内容的位置。
grep命令的输入既可以来自文本文件也可以是从stdin中读取。如
[root@localhost~]# echo -e "this is a word\nnext line" | grep word
thisis aword
[root@localhost~]#
它还有大量有趣的选项。
-c
(count)统计文件或文本中包含匹配字符串的行数,而不是个数,如
[root@localhost~]# cat test.txt
test128 apple
test323 good
test434 bad
test226 apple
[root@localhost~]# grep -c "apple" test.txt
2
-v
(invert-match)打印除包含match_pattern 行之外的所有行
[root@localhost~]# grep -v "apple" test.txt
test323 good
test434 bad
[root@localhost~]#
-l
搜索多个文件并找出匹配文本位于哪一个文件中
$ grep-l "apple" test.txt test.sh
test.txt
-e
在进行匹配的时候通常只指定一个样式。然而,我们可以用选项 -e来指定多个匹配样式
$ grep-e "bad" -e "good" test.txt
test323 good
test434 bad
-n
打印出包含匹配字符串的行号
-r
需要在多级目录中对文本进行递归搜索,可以使用。它用于查找某些文本位于哪些源
码文件中。它还需要指明一个路径作为搜索的入口
$ grep-r "apple" .
./test.txt:test128 apple
./test.txt:test226 apple
命令中的“.”指定了当前目录
--include\--exclude\--exclude-dir
grep可以在搜索过程中指定(include )或排除(exclude)某些文件或目录。我们通过通配符来指定所include文件或exclude文件或目录。如
[root@localhostflask]# ll
total16
-rw-r--r--1 root root 0 May 13 17:49 __init__.py
drwxr-xr-x4 root root 4096 May 14 19:25 project
-rw-r--r--1 root root 88 May 14 19:25 run2.py
-rw-r--r--1 root root 556 May 14 19:10 run.py
[root@localhostflask]#
如要排除在project目录下搜索,可以写为
[root@localhostflask]# grep -rn app . --exclude-dir "project"
下述写法是不对的
[root@localhostflask]# grep -rn app . --exclude-dir "./project"
-q
有时候,我们并不打算查看匹配的字符串,而只是想知道是否能够成功匹配。这可以通过设置grep的静默选项(-q)来实现。在静默模式中,grep命令不会输出任何内容。它仅是运行命令,然后根据命令执行成功与否返回退出状态。 如果命令运行成功会返回0,如果失败则返回非0值。
$ grep-q "apple" test.txt
$ echo$?
0
$ grep-q "Apple" test.txt
$ echo$?
1
-A\-B\-C
假设已经找到了给定文本的匹配行,通常情况下grep只会打印出这一行。但我们也许需要匹配行之前或之后的n行,也可能两者皆要。这可以在grep中用前后行控制选项来实现。
要打印匹配某个结果及其之后的行,使用 -A选项;要打印匹配某个结果及其之前的行,使用-B选项;要打印匹配某个结果及其之前以及之后的行,使用-C选项。如
$ grep"good" test.txt -A 1
test323 good
test434 bad
-o
只输出文件中匹配到的文本部分,而不是一整行
-E
grep命令只解释match_text中的某些特殊字符。
[root@localhostsrc]# ll | grep .h$
-rw-rw-r--1 root root 3451 Jun 20 2013 adlist.h
-rw-rw-r--1 root root 4531 Jun 20 2013 ae.h
如果要使用正则表达式的扩展集,需要添加-E选项——这意味着使用扩展(extended )正则表达式。或者也可以使用默认允许正则表达式的grep命令——egrep。
[root@localhost~]# cat test.txt | grep go+d
[root@localhost~]#
[root@localhost~]# cat test.txt | grep -E go+d
test323good
grep命令中的正则不需要使用“//”来界定一个模式。
#匹配一个电子邮件地址
$egrep -o '[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}' url_email.txt
#匹配HTTPURL
$egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}" url_email.txt