find & grep 总 结
前言
关于本文
总 结 了 find、grep常 规 用 法,正 则 表 达 式,find与 grep合 用 以 及 自 定 义 搜 索 函 数 等
什么是find和grep
find 和 grep 是 linux中 最 常 用 的 两 个 搜 索 函 数,本 文 将 会 介 绍 并 例 示 这 两 个 函 数 的 用 法。
为什么要用find和grep
对 其 的 熟 练 掌 握 可 以 明 显 提 高 搜 索 效 率,尤 其 是 面 对 动 辄 几 十 G 源 码 时 。
关 于 参 数
find和grep有很多参数,可以用以下命令导出查看:
参数可以帮助我们在使用时提高效率,实现特定需求以及避免错误,本文会介绍一些常用参数。
两者的区别,用find还是用grep
关于用find还是用grep,只要掌握一个原则就可以了:
凡是搜索文件名,就用find
凡是搜索文件内容,就要grep(当然为了提高效率可以结合find使用,后面会讲)
find基本用法
搜索文件名
例:在当前目录搜索名称为DialactsActivity.java的文件
参数 –a –o –not
分别为与、或、非的意思,相当于find中的逻辑运算
例1:在当前目录搜索除了AndroidManifest.xml文件以外其他的xml文件
例2:在当前目录搜索名称为values-zh-rCN或values的文件
参数 –prune
该参数的作用是忽略某个文件,即不在这个文件夹里搜索文件以提高效率,该参数常和-o一起使用
例1:在当前目录且不在res文件中搜索名为values-zh*的文件并打印
Note:最后的-print,如果不加-print结果中除了打印不在res文件中的values-zh*文件之外还会打印find . -name res这个搜索出来的结果
tips:*为通配符
参数 –exec
find命令后加入该参数可以对搜索结果进行处理
例:在当前目录搜索所有java文件并将其删除
Note:{} 表示前面搜索的结果, “; ”表示命令结束, “ \ ”用于转义且前面必须要有空格
参数 –type
该参数用于指定查找文件的类型
例1:在当前目录查找文件名包含res的文件夹
-type参数后跟指定的文件类型,d为文件夹,f为普通文件
参数 –size
用于指定查找文件的大小(单位b、k、M、G)
例1:在当前目录查找所有小于10k的文件
find ./ –size -10k
例2:在当前目录查找所有大于10M的文件
find搜索匹配进阶及RE(正则表达式)
-name
-regex
-regex是将文件的输出结果进行匹配而不是文件名
比如,当前目录中有a文件夹,a中有b文件夹,b中有c文件
那c文件的文件名为c,输出结果为./a/b/c,前者用于-name匹配,后者用于-regex匹配
-regex相对于-name的优势是可以使用正规的RE
例:搜索所有输出结果包含res的文件(哪怕文件名不包含res,只要该文件在res文件夹中也都可以被搜索到)
find . –regex “.*res.*”
Note:这里匹配所有字符是 .* 而不是 *
简单的RE符号及用法
grep基本用法
先用两个例子看grep最简单的用法
例1:在Android.mk文件中搜索包含res的行
例2:在当前目录的所有文件中搜索包含res的行
参数 –r
表示在当前目录和子目录中循环搜索(加入该参数可以不用指定文件,意为已经指定了当前目录及子目录中的所有文件)
参数 –n
输出的结果打印行号
例:在当前目录及子目录中的所有文件中搜索包含res的行并打印行号
参数 –i
查找匹配忽略大小写,默认状态下会匹配大小写
参数 –l(L的小写,不是大写的i)
输出结果只显示文件名,不显示行
参数 -s
不显示不存在或无匹配文件的错误信息
参数 –w
可以精确匹配后面的单词,而不是字符串匹配
参数 -v
逆反模式,即输出不匹配的所有行
grep中RE的使用以及egrep
find中所说的REgrep这边都可以使用,后面不再赘述,需要注意的是 + 、?要用\转义
什么是egrep
egrep是grep的进化版,改进了许多grep中不方便之处如下:
egrep使用RE符号 + , ? , | (或) , {} 时不用转义,如果要用其本身则需要/转义
所以,如果需要用到RE的话,尽量选择egrep
简单的RE符号及用法
find和grep的在搜索中的实际应用-进阶
前面说了这么多,其实都是在为这一小节做铺垫,相信在实际应用中大家不会在源码中直接去grep搜索,这样会相当耗时,因此,我们需要掌握一些技巧以使搜索变得简单而又高效:
find和grep结合使用
在实际应用中,find和grep配合使用将会非常方便而迅速,先看一个例子:
这个是位于Android源码build/envsetup.sh中的jgrep函数,用于搜索java文件内容,是经常使用的一个函数,是find结合grep的典型案例。如果已经确定了搜索内容在java文件中,那么相比于直接用grep进行全局搜索,这种先搜索所有的java文件,再在其中搜索内容的方式可以显著提高效率。
find、grep中xargs 和 | 的使用
编写搜索函数
学习find和grep的使用是为了使用方便和提高效率,如果每次搜索都和上面的例子那样敲一堆命令,虽然提高了效率,方便和使用性上却大打折扣,因此,我们需要将命令进行抽象,编写搜索函数,就如同之前所讲的系统自带的jgrep函数一样,做到真正的实用而又高效。
为了更加直观,举一个例子来说明如何编写搜索函数,这里需要用到一些简单的编写shell脚本基础知识: