• 每天进步一点点!

文章分类

推荐网站

常用手册

linux查找文本命令 grep(一)【原创】

<<返回

2011-11-11 14:45:34

  • grep的用途:

显示匹配一个或多个模式的文本行。grep命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格,就必须用引号把它括起来。grep命令中,模式可以是一个被引号引起了的字符串,也可以是单个词,位于文件后的所有单词都会被认为是文件名。grep将输出发送到屏幕,他不会对输入文件做任何修改和变化。 时常会作为管道的第一步,以便对匹配的数据作进一步处理。

 

  • grep家族

grep

最早的文本匹配程序,所使用POSIX定义的基本正则表达式(Basic Regular Expression, BRE)

egrep

扩展式grep这个程序使用的是扩展的正则表达式(Extended Regular Expression, ERE)——这是一套功能更强大的正则表达式,

使用它的代价就是会消耗更多的运行资源。在早期出现的PDP-11的机器上,这点事关重大,不过以现在的系统而言,在性能影响上几乎没有太大的差别。

fgrep

快速grep(fast grep)。这个版本匹配固定字符串而非正则表达式,它使用游湖的算法,能更有效的匹配固定字符串。也就是说

,grep和egrep智能匹配单个正则表达式,儿fgrep使用不同的算法,却能匹配过个字符串,有效地测试每个输入行里,是否有匹配的查找字符串。

 

  • grep 的语法:

 

grep [options ...] pattern-spac [files ...]

grep  word  fliename1  filename2 ...

 

 

  • grep使用的正则表达式元字符

 

元字符

功能

示例

匹配对象

^

行首定位符

‘^simaopig%’

匹配所有以simaopig开头的行

$

行尾定位符

‘simaopig$’

匹配所有以simaopig结尾的行

.

匹配任意一个字符

‘s.m’

匹配包含一个s字符,后面跟一个字符(随意),再跟一个m的行

*

匹配0或多个前一字符

‘s*m’

匹配包含零个或多个s字符,后面跟有一个m字符的行

[]

匹配一组字符中的任意一个

‘[Ss]imaopig’

匹配simaopig,或者Simaopig

[^]

匹配不在指定字符组内的字符

‘[^a-z]imaopig’

匹配不包含在a-z之间的字符后跟着imaopig的行,即所有aimaopig-zimaopig的行都不包含(有点绕)

\<

词首定位符

‘\

匹配以simaopig为开头的词的行,simaopigabcd也是可以的

\>

词尾定位符

‘simaopig\>’

匹配以simaopig为结尾的词的行,abcdsimaopig也是可以的

\(..\)

标记匹配的字符

‘\(simaopig\)'s blog’

标记寄存器里的一段字符,该寄存器被记作1号寄存器。以后引用这段字符时,可以使用\1来重复该模式。9个标签中最左边的是第一号。例如,模式simaopig被保存在1号寄存器里,之后用\1来引用它。

x\{m\}或x\{m,\}或x\{m,n\}

字符x的重复出现

‘s\{5\}’,'s\{5,\}’,'s\{5,10\}’

匹配连续出现5个s、至少5个s或5到10个s的行

 

 

  • grep使用的正则表达式元字符例子

 cat test_grep.txt

 

abc def hic lmn abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

A BC     Def     hIc     lmN     ABC

You     are     a       good    boy

you     are     a       good    girl

you     are     not     a       good girl

That's  a       very    lovely  dog

 

例一:

 

grep ABC test_grep.txt
#ABC     Def     hIc     lmN     ABC
grep 'ABC' test_grep.txt
#ABC     Def     hIc     lmN     ABC
grep "ABC" test_grep.txt
#ABC     Def     hIc     lmN     ABC

 

当匹配模式为单个单词时既可以加单引号或双引号,也可以不加。

 

例二:

 

grep A BC test_grep.txt   #注意:A和BC之间有空格

 

当匹配模式之间有空格时,将会报错:

 

grep: BC: 没有那个文件或目录

test_grep.txt:ABC     Def     hIc     lmN     ABC

test_grep.txt:A BC     Def     hIc     lmN     ABC

此时grep会认为要查找的文件时BC 和test_grep.txt

 

例三:

grep ^Y test_grep.txt 
#You     are     a       good    boy
grep ‘^Y’ test_grep.txt 
#You     are     a       good    boy

虽然第一个shell并没有错,但是当匹配模式为正则表达式,最好加上引号。

 

例四:

grep '1\...' test_grep.txt 
#123     456     1.23    4.5     321

 

打印含有数字1后面一个点再后面是两个任意字符的行,此处的第一个点做了转义

 

例五:

grep '^[Aa]' test_grep.txt
#abc	def	hic	lmn	abc
#ABC     Def     hIc     lmN     ABC
#A BC     Def     hIc     lmN     ABC

打印以大写的A或小写的a开头的行。

 

例六:

grep '[^0-9]' test_grep.txt

#abc	def	hic	lmn	abc
#123     456     1.23    4.5     321
#ABC     Def     hIc     lmN     ABC
#A BC     Def     hIc     lmN     ABC
#You     are     a       good    boy
#you     are     a       good    girl
#you     are     not     a       good girl
#That's  a       very    lovely  dog

 

打印含有非数字的行,由于第二行含有小数点,所以也当作非数字打印了。

grep '^[^0-9]' test_grep.txt

#abc	def	hic	lmn	abc
#ABC     Def     hIc     lmN     ABC
#A BC     Def     hIc     lmN     ABC
#You     are     a       good    boy
#you     are     a       good    girl
#you     are     not     a       good girl
#That's  a       very    lovely  dog

 

打印以非数字开头的行。

 

例七:

类似与例六,可以打印一个目录下的所有文件(不含目录),或一个目录下的所有目录(不含文件)

ll | grep '^d'
#只打印一个目录下所有的目录
grep '[^0-9]' test_grep.txt
#只打印一个目录下所有的文件
ll | grep -v '^d'
#与上面的第二个命令相同,也是只打印一个目录下所有的文件,-v是反向查找,
#只打印不匹配的行。后面将会介绍。

 

例八:

grep '^A *' test_grep.txt

#ABC     Def     hIc     lmN     ABC
#A BC     Def     hIc     lmN     ABC

 

注:在grep支持的正则表达是里面没有‘+’,‘?’,如果一定要匹配含有个数可以用‘{’, '}'。例如上面要匹配以A开头后面至少含有一个空格的行,可以用下面的方式。

grep '^A \{1,\}' test_grep.txt
#A BC     Def     hIc     lmN     ABC

 

例九:

cat test_grep.txt

 

abc def hic lmn abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

ABC     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     ABC

You     are     a       good    boy

you     are     a       good    girl

you     are     not     a       good girl

That's  a       very    lovely  dog

 

 

grep '^[A-Z]\{3\}' test_grep.txt

#ABC     Def     hIc     lmN     ABC
#ABC     Def     hIc     lmN     dsf 

grep '^([A-Z]\{3\}).*1$' test_grep.txt

#ABC     Def     hIc     lmN     ABC

 

注意第二个的后向引用,打印 以3个大写字母开头,中间可以有任意多个任意字符,但必须以开头的3个字母结尾 的行

 

例十:

 

grep '\<you' test_grep.txt
#you     are     a       good    girl
#you     are     not     a       good girl
  
grep '\<good\>' test_grep.txt
#You     are     a       good    boy
#you     are     a       good    girl
#you     are     not     a       good girl
  
grep '\<good girl\>' test_grep.txt
#you     are     not     a       good girl

 

"\<"是词首定位符,"\>"是词尾定位符。第一个打印词首含有“you”的行,第二个打印含有单词“good”的行,第三个打印含有单词“good girl”的行,这里把“good girl”当做了一个词

文章评论

  • 暂无评论

发表评论

昵称:

内容:

发表评论