分享

grep高级应用

 TUBOSS 2014-09-17
grep find 命令在此列一下,提示自己不要忘记 
grep 
1.作用 
grep命令能指定文件中搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,他的使用权限是所有用户。 
2.格式 
grep [options] 
3.主要参数 
[options]主要参数: 
-c:只输出匹配行的计数。 
-I:不区分大小写(只适用于单字符)
-h:查询多文件时不显示文件名。 
-l:查询多文件时只输出包含匹配字符的文件名。 
-n:显示匹配行及行号。 
-s:不显示不存在或无匹配文本的错误信息。 
-v:显示不包含匹配文本的所有行。 
pattern正则表达式主要参数: 
:忽略正则表达式中特别字符的原有含义。 
^:匹配正则表达式的开始行。 
$: 匹配正则表达式的结束行。 
:到匹配正则表达式的行结束。 
[ ]:单个字符,如[A]即A符合需求 。 
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合需求 。 
。:所有的单个字符。 
* :有字符,长度能为0。 
正则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是个能描述一类字符串的模式(Pattern)。如果一个字符串能用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS中用户能使用通配符 “*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,及对文本执行“搜索-替换”操作和其他功能。 
4.应用实例 
查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,不过却忘了第二部分中的其余部分,只知到有两个句点,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]{3 }.[0-0{3}。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。 
$grep ’[0-9 ]{3 }.[0-0{3}’ ipfile 
补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持q模式范围的应用及和之相对应的一些更加规范的模式。 
find 
1.作用 
find命令的作用是在目录中搜索文件,他的使用权限是所有用户。 
2.格式 
find [path][options][expression] 
path指定目录路径,系统从这里开始沿着目录树向下查找文件。他是个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。 
3.主要参数 
[options]参数: 
-depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。 
-maxdepth levels:表示至多查找到开始目录的第level层子目录。level是个非负数,如果level是0的话表示仅在当前目录中查找。 
-mindepth levels:表示至少查找到开始目录的第level层子目录。 
-mount:不在其他文件系统(如Msdos、Vfat等)的目录和文件中查找。 
-version:打印版本。 
[expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。他的参数非常多,这里只介绍一些常用的参数。 
name:支持统配符*和?。 
-atime n:搜索在过去n天读取过的文件。 
-ctime n:搜索在过去n天修改过的文件。 
-group grpoupname:搜索所有组为grpoupname的文件。 
-user 用户名:搜索所有文件属主为用户名(ID或名称)的文件。 
-size n:搜索文件大小是n个block的文件。 
-print:输出搜索结果,并且打印。 
4.应用技巧 
find命令查找文件的几种方法: 
(1)根据文件名查找 
例如,我们想要查找一个文件名是lilo.conf的文件,能使用如下命令: 
find / -name lilo.conf 
find命令后的“/”表示搜索整个硬盘。 
(2)快速查找文件 
根据文件名查找文件会遇见一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在非常深的子目录中时。如果我们知道了这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省非常多时间。比如smb.conf文件,从他的文件后缀“.conf”能判断这是个设置文件,那么他应该在/etc目录内,此时能使用下面命令: 
find /etc -name smb.conf 
这样,使用“快速查找文件”方式能缩短时间。 
(3)根据部分文件名查找方法 
有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件能输入下面命令: 
find / -name ’*abvd*’ 
  输入这个命令以后,Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。 
(4) 使用混合查找方式查找文件 
  find命令能使用混合查找的方法,例如,我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则能使用-and (和)把两个查找参数链接起来组合成一个混合的查找方式。 
find /etc -size +500000c -and -mtime +1 
3.grep命令系统调用 
  grep是Linux/Unix中使用最广泛的命令之一,许多Linux系统内部都能调用他。 
  (1)如果要查询目录列表中的目录,方法如下: 
$ ls -l | grep ’∧d’ 
  (2)如果在一个目录中查询不包含目录的所有文件,方法如下: 
$ ls -l | grep ’∧[∧d]’ 
  (3)用find命令调用grep,如所有C原始码中的“Chinput”,方法如下: 
$find /ZhXwin -name *.c -exec grep -q -s Chinput {} ;-print 







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的功能。
grep的工作方式是这样的,他在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
2. grep正则表达式元字符集(基本集)

锚定行的开始 如:’^grep’匹配所有以grep开头的行。 

锚定行的结束 如:’grep$’匹配所有以grep结尾的行。 

匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。 

匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] 
匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。 
[^] 
匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 
\(..\) 
标记匹配字符,如’\(love\)’,love被标记为1。 
\ 
锚定单词的开始,如:’\
\> 
锚定单词的结束,如’grep\>’匹配包含以grep结尾的单词的行。 
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的行。
\w 
匹配文字和数字字符,也就是[A-Za-z0-9],如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
\W 
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b 
单词锁定符,如: ’\bgrepb\’只匹配grep。
3. 用于egrep和 grep -E的元字符扩展集

匹配一个或多个先前的字符。如:’[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
 
匹配零个或多个先前的字符。如:’gr?p’匹配gr后跟一个或没有字符,然后是p的行。
a|b|c 
匹配a或b或c。如:grep|sed匹配grep或sed
() 
分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
x{m},x{m,},x{m,n} 
作用同x\{m\},x\{m,\},x\{m,n\}
4. POSIX字符类
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特别的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把他们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。
[:alnum:] 
文字数字字符
[:alpha:] 
文字字符
[:digit:] 
数字字符
[:graph:] 
非空字符(非空格、控制字符)
[:lower:] 
小写字符
[:cntrl:] 
控制字符
[:print:] 
非空字符(包括空格)
[:punct:] 
标点符号
[:space:] 
所有空白字符(新行,空格,制表符)
[:upper:] 
大写字符
[:xdigit:] 
十六进制数字(0-9,a-f,A-F)
5. Grep命令选项
-? 
同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。
-b,--byte-offset 
打印匹配行前面打印该行所在的块号码。
-c,--count 
只打印匹配的行数,不显示匹配的内容。
-f File,--file=File 
从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
-h,--no-filename 
当搜索多个文件时,不显示匹配文件名前缀。
-i,--ignore-case 
忽略大小写差别。
-q,--quiet 
取消显示,只返回退出状态。0则表示找到了匹配的行。
-l,--files-with-matches 
打印匹配模板的文件清单。
-L,--files-without-match 
打印不匹配模板的文件清单。
-n,--line-number 
在匹配的行前面打印行号。
-s,--silent 
不显示关于不存在或无法读取文件的错误信息。
-v,--revert-match 
反检索,只显示不匹配的行。
-w,--word-regexp 
如果被\引用,就把表达式做为一个单词搜索。
-V,--version 
显示软件版本信息。
6. 实例
要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
$ ls -l | grep ’^a’ 
通过管道过滤ls -l输出的内容,只显示以a开头的行。
$ grep ’test’ d* 
显示所有以d开头的文件中包含test的行。
$ grep ’test’ aa bb cc 
显示在aa,bb,cc文件中匹配test的行。
$ grep ’[a-z]\{5\}’ aa 
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ’w\(es\)t.*\1’ aa 
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成’w(es)t.*\1’就能了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多