Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588206
  • 博文数量: 151
  • 博客积分: 3330
  • 博客等级: 中校
  • 技术积分: 1686
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 02:41
文章存档

2011年(151)

分类: LINUX

2011-04-25 22:46:01

grep 如何工作?

grep 命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格,就必须用引号把它括起来。
模式可以是被引号引起来的字符串,也可以是单个词。grep 将输出送到屏幕,不会对输入文件进行任何修改。

grep 命令格式

grep word filename filename

范例

grep tom /etc/passwd

说明:grep 将在文件/etc/passwd中查找模式tom。如果成功,文件中相应的行会显示在屏幕上,否则,就不会有任何输出。

grep 程序的输入可以来自标准输入或者管道,而不仅仅是文件。

范例:
ps -elf | grep root

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

元字符      功能            实例                    匹配对象

^          行首定位符       '^love'                 匹配所有love开头的行
$          行尾定位符       'love$'                 匹配所有以love结尾的行
.          匹配一个字符     'L..e'                  匹配包含一个L,后跟两个字符,在跟一个e的行
[]         匹配一组字符     '[Ll]ove'               匹配Love或者love 的行
           中任一个
*          匹配零个或多个   '*love'                 匹配包含跟在0个或多个空格后的模式love行
           前导字符
[^]        匹配不在指定字   '[^A-K]ove'             匹配包含一个不在A-K之间的字符,并且该字符            符组内的字符                             后紧跟着ove行
\<         词首定位符       '\
\>         词尾定位符       'love\>'                匹配包含以love结尾的词的行
\(..\)     标记匹配到的字   '\(love\)ing'           love被保存在1号寄存器里,可以用\1来引用它
           符
x\{m\}     字符x的重复出现   'o\{5\}'               匹配连续5个o
           次数
x\{m,\}    m次,至少m次      'o\{5,\}'              匹配至少5个o
x\{m,n\}   至少m次但不超过n次  'o\{5,10\}'          匹配5-10个o


grep 的选项

-b    在每一行前面加上其所在的行号
-c    显示匹配到的行的数目,而不是显示行的内容
-h    不显示文件名
-i    比较字符忽略大小写的区别
-l    只列出匹配行所在文件的文件名(每个文件名只列以次),文件名之间用换行符分割
-n    在每一行前面加上它所在文件中的相对行号
-s    无声操作,即只显示报错信息,以检查退出状态
-v    反向查找,只显示不匹配的行
-w    把表达式作为词来查找
-a    将二进制文件当文本文件处理
-e    
-f FILE 从FILE中获得匹配的模式,每行一个,grep将从目标文件中查找与FILE中模式匹配的行
例如:
cat file01
north
west
root
green

file01中包含了north,west,root,green 四个模式

grep -f file01 datafile 
grep将从file01中获取查找模式,与datafile 中的行进行匹配


-L   仅打印所有未能匹配模式的文件名
-m NUM  如果文件是标准输入或正规文件,在找到指定数量 NUM 的匹配行后停止读文件
-C   打印匹配行的前2行和后2行的内容,等同于 -2 
例如:
grep -2 north datafile
grep -C north datafile

-A NUM  打印匹配行后面NUM行的内容:即匹配行及它后面指定NUM行的内容
例如:
grep -A 2 north datafile
查找匹配north模式的行后,显示该行及其后两行的内容

-B NUM  打印匹配行前面NUM行的内容:即匹配行及它前面指定NUM行的内容
例如:
grep -B 2 north datafile 
查找匹配north模式的行后,显示该行及其前两行的内容
(NUM 是用来代表整数值的符号)
-x 仅选择精确匹配正行的哪些匹配
-Z 在文件名的末尾放上ASCII空字符以取代换行符
  

举例:
1. grep NW datafile       打印文件datafile中所有包含正则表达式NW的行
2. grep NW d*             打印所有以d开头的文件中,包含正则表达式NW的所有行
3. grep  '^n'  datafile   打印所有以n开头的行
4. grep  '4$'  datafile   打印所有以4结尾的行
5. grep TB Savege datafile  grep 在文件Savege和datafile中查找TB
6. grep  '5\..' datafile  打印所以包含数字5,后跟一个据点,再跟任意一个字符的行
7. grep  '\.5'  datafile  打印所有包含表达式“.5”的行
8. grep  '^[we]' datafile 打印所有以字母w或者e开头的行
9. grep  '[^0-9]' datafile 打印包含非数字字符的所有行
10.grep '[A-Z][A-Z] [A-Z]' datafile 打印所有包含两个大写字符,后跟一个空格和一个大写字符的行
11.grep 'ss* ' datafile  打印包含一个s,后跟0个或者多个连着的s和一个空格的文本行
12 grep '[a-z]\{9\}' datafile  打印至少9个小写字符连在一起的行
13.grep '\(3\)\.[0-9].*\1 *\1' datafile  
   打印包含一个3后跟一个句点和一个数字,再跟任意多个字符(.*),然后跟一个3,和任意多个制表符,再跟一个3 的行
14.grep '\
15.grep ‘\’ datafile  打印所有包含单词north 的行
16. grep '\<[a-z].*n\>' datafile 打印包含以小写字母开头,后跟任意多个字符,以n结尾的单词的行

17. grep 'green' datafile01 datafile02 
grep 将在datafile01 和datafile02 中查找匹配模式green的行,并且在匹配的行前加上查找的文件名


选项举例

grep -l 'SE' *
只输出包含模式SE的 文件名,而不输出文本行


扩展的grep,即egrep

egrep 使用的正则表达式和grep 一样,只是多了下面几个

+  匹配一个或多个加号前的字符     '[a-z]+ove'   匹配一个或者多个小写字母后跟ove的字符串
                                                将找出:move approve love behoove等字符串

?  匹配零个或一个前导字符         'lo?ve'       匹配字母l后跟一个或零个字母o以及ve的字符串
                                                将找出:love lve等

a|b  匹配a或b                     'love|hate'   匹配love和hate这两个表达式之一

()   字符组                       'love(able|ly)(ov)+'  匹配lovable 或 lovely
                                                        匹配ov的一次或多次出现

举例

egrep 'NW|EA' datafile   打印包含表达式NW或EA的行
egrep '3+' datafile 打印包含一个或多个数字3的行
egrep '2\.?[0-9]' datafile  打印包含数字2,后跟零个或一个句点,在跟一个数字的行
egrep '(no)+' datafile  打印连续出现一个或多个模式组no的行,将匹配 no,nono,nononononono等
egrep 'S(h|u)' datafile 答应你所有包含字母S,后跟h或者u的行
egrep 'Sh|u' datafile 打印所有包含表达式Sh或u的行


GNU 版本的grep 正式表示元字符基本集

\w  所有字母和数字,称为[A-Za-z0-9]   l\w*e  
\W  所有字母和数字之外的字符,称为非字符 [^A-Za-z0-9]  love\W+
\b  词边界      \blove\b   仅匹配love 这个单词

grep 'pattern' filename   基本的RE元字符
grep -G 'pattern' filename 含义同上
grep -E 'pattern' filename 扩展RE元字符
grep -F 'pattern' filename 非RE元字符
grep -P 'pattern' filename 将模式解释为perl RE

递归的grep
grep -r 'tom' /  
在根目录及其子目录中寻找包含tom的所有文件



 

阅读(4964) | 评论(0) | 转发(1) |
0

上一篇:LINUX进程及管理

下一篇:linux sed 流编辑器

给主人留下些什么吧!~~