文本内容搜索利器-grep

       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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容