grep与find区别
- grep:查找指定目录下过滤文本文件中行数据
- find:查找指定目录下文件
1. grep使用
格式: grep "text" * [选项]
选项:
- -A num, --after-context=num: 在结果中同时输出匹配行之后的num行
- -B num, --before-context=num: 在结果中同时输出匹配行之前的num行,有时候我们需要显示几行上下文。
- -i, --ignore-case: 忽略大小写
- -n, --line-number: 显示行号
- -R, -r, --recursive: 递归搜索子目录
- -v, --invert-match: 输出没有匹配的行
- -w :只显示全字符合的列,例如搜索"CONFIG_DM9000",就不会出现"CONFIG_DM9000_BASE"字段
- -x :只显示全列符合的列
实例
grep "33F80000" * -nR //递归地查找当前目录下所有文件中带"33F80000"行的数据,并显示出来
如下图所示:
grep "\-pie" * -nR //递归查找当前目录下所有文件,带有"-pie"一行的代码
grep -5 'parttern' * -nR//打印匹配行的前后5行
grep -A 5 'parttern' -nR //打印匹配行的后5行
grep -B 5 'parttern' -nR //打印匹配行的前5行
如果想递归查找该目录下指定文件名称的内容,用--include:
grep "config" . -R --include=*config // --include表示只在后缀名config文件文件名里找
grep "config" . -R --include=*{config,.c} //只在后缀名config 和*.c文件名中寻找"config"内容
如果想搜索某个不指定文件名的内容时,用-exclude:
grep "config" . -R --exclude=*{config,.c} //递归寻找config字段,并排除掉config和*.c后缀名的文件
也可以使用ag命令 ,输入的字数更短.比如: ag "\-pie"
如果想使用正则表达:
注意为了避免shell的元字符对正则表达式的影响,请用单引号(’xxx’)括起来,千万不要用双引号括起来(”xxx”)或者不括起来。
例如:
grep 'E*A' -nER // 表示匹配0个或1个的普通字符,E表示expression
grep 'mem*\(' -nER // 查找mem开头的函数
grep ‘god|good’ -nER // 查找god或者good字段
2.关键词查找shell
#!/usr/bin/bash
# varAndFuncFind: 用来查找变量和函数的关键词
function varAndFuncFind(){
grep -irn --include=*.h --include=*.c --include=*.cpp $2 $1 |grep -v ${1^^}|grep '(' |grep -v class|grep -v struct |grep -v EMAP_LOG |grep -v '\.h' >> tmp/$2.txt
}
# funcFind: 用来查找函数关键词
function funcFind(){
grep -rn --include=*.h --include=*.c --include=*.cpp "$2(" $1 |grep -v class |grep -v struct |grep -v EMAP_LOG |grep -v '\.h' >> tmp/$2.txt
}
# multipleFind: 用来查找多个类似的关键词
# grep -v class | grep -v struct |grep -v LOG |grep -v '\.h' : 表示屏蔽类定义和头文件声明的字段,比如: #include "classXXX.h"、 class XXX{、等
function multipleFind(){
dir=$1 # 要查找的目录
shift 1 # shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1)
for k in $@
do
grep -rn --include=*.c --include=*.cpp $k $dir |grep -v class|grep -v struct|grep -v '\.h'
done
}
function scan(){
rm -rf tmp && mkdir -p tmp
arr[0]=main/config # 查找该目录下的关键词
arr[1]=system/dev
for dir in ${arr[@]}
do
echo $dir
funcFind $dir system
funcFind $dir open
funcFind $dir exec
varAndFuncFind $dir command
funcFind $dir sprintf
varAndFuncFind $dir for
multipleFind$dir Cmd cmd comd >> tmp/cmd.txt // 查找Cmd 、cmd 、 comd字段到cmd.txt
done
}
$@
然后在findCfg.txt里面写下要遍历的当前路径下的目录即可.比如findCfg.txt内容为:
mian/config system/dev
然后就可以找到对应的关键词
3.grep和sed命令联合使用
sed -i "s/\<1.46.0\>/1.46.1/g" `grep -rwl "1.46.0" *`
sed
-i 表示操作的是文件
s/a/b/表示查找a并替换为b,所以会将\<1.46.0\>变成1.46.1 后面跟/g表示文件中所有的a都替换成b
grep
-r 表示查找所有子目录
-w 表示完全匹配
-l 表示仅列出符合条件的文件名,用来传给sed命令做操作
* 表示要查找的根目录为当前目录
4.find使用
格式: find [选项] text
常用选项:
-name : 查找文件名
实例:
find -name Makefile //查找当前目录下Makefile文件
find /work -name start.c //查找指定目录/work/下start.c文件
find -name boot* //查找当前目录下带boot开头的所有文件(就能找到boot.c,boot.o,boot.bin等)
find -name *boot //查找当前目录下名字中带有boot的所有文件 ,*:表示通配符,*boot就是通配所有包含boot的内容
find -name *.c //查找当前目录下所有.c文件 <br> find ./ -print // -print :打印数据