grep工具介绍
目录
简介
用"grep"搜索文本文件
如果您要在几个文本文件中查找一字符串,可以使用"grep"命令。“grep"在文本中搜索指定的字符串。
假设您正在”/usr/src/linux/Documentation"目录下搜索带字符串"magic"的文件:
$ grep magic /usr/src/linux/Documentation/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件"sysrp.txt"包含该字符串。
默认情况下,“grep"只搜索当前目录。如果此目录下有许多子目录,“grep"会以如下形式列出:
grep: sound: Is a directory
这可能会使"grep"的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
当然,如果预料到有许多输出,您可以通过 管道 将其转到"less"上阅读:
$ grep magic /usr/src/linux/Documentation/* | less
这样,您就可以更方便地阅读。
grep用法
grep的用法
grep [OPTION] regular_expressions [filename1…] regular_expressions:是正则表达式,一般用单引号把正则表达式括起来。当然,也可以不使用正则表达式而使用字符串,使用字符串时一般使用双引号把字符串括起来。
grep选项
-c 只输出匹配行的计数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示不存在或无匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-E 使用扩展正则表达式
-w 如果使用\<和\>引用,就把表达式作为一个单词搜索
--color 可以用来设置找到的关键字的颜色,常用--color=auto
[] 在[]当中“仅代表一个待搜索的字符”[dz]字符d或字符z的意思,
而[0-9a-z]则表示该字符要么是数字要么就是小写字母
grep结合基础正则表达式
RE字符 意义与范例
.
代表任意一个字符(允许匹配ASCII集中任意字符,包括空格)
grep –n "e.e" regular_express.txt
搜索的字符串可以是(eve)(eae)(eee)(e e),但不能仅有(ee)
^word
代表搜索的字符串(word)在行首
grep –n "^e" regular_express.txt
搜索行首为e开始的行
word$
代表搜索的字符串(word)在行尾
grep –n "^e" regular_express.txt
搜索行尾为e开始的行(只对linux规格文件有效,dos规格文件结尾是^M$)
grep –n "^$" regular_express.txt
搜索所有空行
*
重复零个或多个的前一个RE字符
grep –n "ess*" regular_express.txt
搜索包含(es)(ess)(esss)等字符串,注意*可以是0个,所以es也是符合待搜索的字符串。
若要显示任意字符,则为“.*”
\
去除特殊符号的特殊意义
grep –n "\*" regular_express.txt
搜索含有*符号的行
[]
字符集合的RE特殊字符的符号
[list]
grep –n "g[ld]" regular_express.txt
搜索含有(gl)或(gd)的那一行
注意,在[]当中“仅代表一个待搜索的字符”,即[afl]代表a或f或l的意思
[ch1-ch2]
grep –n "[0-9] regular_express.txt
搜索含有任意数字的那一行
注意,在字符集合[]中的减号-表示在两个字符之间的所有连续字符
[^]
grep –n "oo[^t]" regular_express.txt
搜索的字符串不能是(oot)可以是(ood)等
注意,符号^用在[]中,表示否定或不匹配括号里的内容
word\{n,m\}
连续n到m个word
若为word\{n\}则是连续n个word
若为word\{n,\}则是连续n个以上word
若为word\{,m\}则是最多出现m次
grep –n "go\{2,3、}g" regular_express.txt
在g与g之间有2~3个的o存在的字符串
\(word\)
标记匹配字符
grep –n "w\(es\)t.*\1" test
如果west被匹配,则es就被存储到内存中,并标志为1,然后搜索任意个字符(.*),
这些字符后面紧跟另外一个es(\1),找到就显示该行。
也就是说westkkkes、westadfaesssss、eadfwestddesdd均可显示出来。
如果使用了-E或egrep的话,就可以不用\跳脱符,直接使用()即可。
\<word\>
行中如果含有word这个单词则显示
grep –n "\<west\>" test.txt
会显示I west、west,但包含west的字符串不会显示(westadfafes)
\w
\W
\w是匹配文字和数字字符,也就是[A-Za-z0-9]
\W是匹配一个或多个非单词字符,如点好句号等
grep –n "G\w*p" test.txt
列出G后面跟零个或多个文字或数字字符,然后是p的行
grep –n "G\W*p" test.txt
列出G后面跟零个或多个非文字或非数字字符,然后是p的行
\bword\b
锁定只对word匹配的行,作用和\<word\>类似
grep –n "\bwest\b" test.txt
@tsingchan