grep时排除指定的文件和目录

一、前言

grep是一个很好的关键词搜索工具,可以快捷定位关键词所在文件和行数,但如果无关的文件和文件夹太多的话会很影响搜索的效率和会显示太多无关内容。

litin@linuxService:~/Android/allwinner/cqa64_android_v5.1/android/device$ grep "/proc/sys/kernel/printk" . -Rn
grep: ./softwinner/tulip-common/.git/svn: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/logs: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/objects: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/hooks: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/rr-cache: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/description: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/config: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/refs: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/info: 没有那个文件或目录
grep: ./softwinner/tulip-common/.git/packed-refs: 没有那个文件或目录
grep: ./softwinner/common/.git/svn: 没有那个文件或目录
grep: ./softwinner/common/.git/logs: 没有那个文件或目录
grep: ./softwinner/common/.git/objects: 没有那个文件或目录
grep: ./softwinner/common/.git/hooks: 没有那个文件或目录
grep: ./softwinner/common/.git/rr-cache: 没有那个文件或目录
grep: ./softwinner/common/.git/description: 没有那个文件或目录
grep: ./softwinner/common/.git/config: 没有那个文件或目录
grep: ./softwinner/common/.git/refs: 没有那个文件或目录
grep: ./softwinner/common/.git/info: 没有那个文件或目录
grep: ./softwinner/common/.git/packed-refs: 没有那个文件或目录
./softwinner/tulip-t1/init.sun50iw1p1.rc:51:    write /proc/sys/kernel/printk 0
grep: ./softwinner/tulip-t1/.git/svn: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/logs: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/objects: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/hooks: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/rr-cache: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/description: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/config: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/refs: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/info: 没有那个文件或目录
grep: ./softwinner/tulip-t1/.git/packed-refs: 没有那个文件或目录
./softwinner/tulip-t1_v1/init.sun50iw1p1.rc:51:    write /proc/sys/kernel/printk 0
grep: ./softwinner/tulip-t1_v1/.git/svn: 没有那个文件或目录
grep: ./softwinner/tulip-t1_v1/.git/logs: 没有那个文件或目录

虽然help中说--exclude可以忽略文件和目录,可是实际测试中发现并不能忽略目录。所以,要排除目录,还得用--exclude-dir

例如:

grep -rn --exclude-dir=build_* --exclude-dir=kernel --exclude-dir=drivers --exclude=*.out 'abcdefg' .
grep --exclude-dir=".svn" U_BOOT_CMD * -nR --exclude="cscope.out" --exclude="tags"
		

在当前目录下查找所有abcdefg的字符串,但不在以build_开头的目录、kerneldirvers中查找,同时忽略所有以out为后缀的文件。

 

 二、深入了解grep

grep简介(熟悉的同学可以直接省略这一部分):
    全称是global search regular expression_r(RE) and print out the line,即全文搜索正则表达式,并把匹配的结果打印出来,是linux下非常强大的文本搜索工具。
    因为是命令行工具,它可以灵活地指定匹配模式、选项和要匹配的目标文件,如果结合linux下特有的管道命令" | ",其功能要比windows自带的搜索工具和一些windows下文本编辑器强大很多。
 
    由于工作要求在linux环境下进行C++开发,接触linux时间尚浅,没有遇到一款功能较为齐全且较为顺手的IDE,因此查看源代码时很多功能需要手动在bash下完成,比如常常需要查看一个函数在整个源码库中的调用情况
    grep -r 'function_name' * 
    (*表示当前目录下所有文件,-r表示递归查找,使用的模式较为简单,仅作参考)
    由于现在的很多项目都使用subversion作为版本管理工具,因此每个源码目录下都会有一个.svn 目录,其中包含了很多源码信息。不出意外,你很快会得到满屏幕的打印信息,但是其中大部分的信息都来自于 .svn 目录下的文件。
    有如下两种选择可以去除来自 .svn 目录的结果信息:
    1.使用管道进行双层“过滤”,其中第二次grep使用了-v选项,即逆向匹配,打印出不匹配的行
    grep -r 'function_name' * | grep -v '.svn'
 
    2.或者更简单一些,直接使用--exclude-dir选项,即指定排除目录,注意svn前的 \.
    grep -r --exclude-dir=\.svn 'function_name' * 
 

三、灵活运用grep

    的确,通过简单的选项设置,我们达到了过滤.svn目录的功能,但是每次都要输入 --exclude-dir=\.svn 的选项,似乎太麻烦了一点,幸运的是linux下灵活的配置文件可以解决这一切:
    
    打开 ~/.bashrc (这是bash的当前用户配置文件),在文件的最上方添加这样一条:
    export GREP_OPTIONS="--exclude-dir=\.svn" 
    (注意 = 的前后不能有空格,不然在载入该配置文件时会提示错误)
    export GREP_OPTIONS="--exclude-dir=\.svn --exclude-dir=\.git --exclude=tags --exclude=cscope\.out"
 
    保存并关闭,同时在命令行键入如下命令:
    source ~/.bashrc  (让bash重新读取脚本)
    当然,你也可以简单地关闭shell并重新打开一个shell窗口
 
    这样当你使用grep时,bash都会自动帮你附加--exclude选项,从而节省不少输入的时间:)


参考:
http://winterth.duapp.com/notes/ar03s04.html
http://blog.sina.com.cn/s/blog_7169c8ce0100qkyf.html

--exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN
--exclude-from=FILE   skip files matching any file pattern from FILE
--exclude-dir=PATTERN  directories that match PATTERN will be skipped.
		
参考地址:http://www.cnblogs.com/pengdonglin137/p/3569218.html

发布了164 篇原创文章 · 获赞 245 · 访问量 111万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览