linux grep 学习笔记

1. grep简介

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。

linux使用GNU版本的grep。它功能 更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

egrep就等同于grep -E ,fgrep等同于grep -F

 

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

 

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

 

-n: 输出行号

-i: 忽略大小写

-v: 反向搜索,显示不包含字符串的内容

-l: 查询多个文件,只输出包含匹配字符串的文件名称

-L: 查询不匹配的文件名

-c:只输出匹配行的计数。

 

二、grep使用 例子

 

#显示在aa,bb,cc文件中匹配test的行。

$ grep 'test' aa bb cc

 

#忽略大小写 

more size.txt | grep -i 'b1..*3'  

b124230 

b103303 

B103303 

 

#显示/etc/passwd文件包含root的行内容,显示行好,不区分大小写

grep -ni Root /etc/passwd

 

#查询/etc/passwd文件中不包含root的行内容

grep -v root /etc/passwd

 

#显示所有以d开头的文件中包含 test的行。

[root@eccs_web_bak]#:grep '^root' /etc/passwd

root:x:0:0:root:/root:/bin/bash

 

#单个字符匹配

more size.txt | grep 'b' 

 

行匹配:输出匹配行的计数

grep -c "48" data.doc   #输出文档中含有48字符的行数

 

3、根据条件搜索文件

#在当前目录搜索带root行的文件

grep 'root' *

 

#在当前目录及其子目录下搜索root的行文件

grep -r 'root' *

 

#在当前目录及其子目录下搜索root的行文件,但是不显示匹配的行,只是显示文件名称

grep -r -l 'root' *

 

4、正则表达式

[^]

匹配一个不在指定范围内的字符,如:\'[^A-FH-Z]rep\'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

(..)

标记匹配字符,如\'(love)\',love被标记为1。

x{m}

重复字符x,m次,如:\'0{5}\'匹配包含5个o的行。

x{m,}

重复字符x,至少m次,如:\'o{5,}\'匹配至少有5个o的行。

x{m,n}

 

重复字符x,至少m次,不多于n次,如:\'o{5,10}\'匹配5--10个o的行。

 

查询file_name文件中包含s与t字母之间包含三个字符的行

grep  s...t file_name

查找文件file_name中包含“*”字符的行

grep \* filename

匹配包含单词“abc”的行,全词匹配

grep "\<abc\>" file_name

#显示包含test 或者 tast的行号的内容

grep -n 't[ae]st' /home/huangbiao.txt

 

#显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

$ grep '[a-z]\{5,\}' aa

 

#不匹配行首是48的行

grep '^[^48]' data.doc  

备注:^在[]内代表【反向选择】,在[]外则代表定义在首

 

#匹配正则表达式的开始行

grep '^root' /etc/group  

root::0:root 

 

#匹配root结束行 

grep 'root$' /etc/group  

root::0:root 

mail::6:root 

 

#找出空白行

grep -n '^$' /home/abc.txt

 

如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

 

5、扩展grep(egrep 或者 grep -E)

egrep 'huang|liu' /home/test.text

=grep -e 'huang|liu' /home/test.text

=grep 'huang\|liu' /home/test.text

猜你喜欢

转载自hbiao68.iteye.com/blog/2121837
今日推荐