在 Linux 下用 grep 时高亮显示匹配的部分
用 grep 匹配文件时,显示结果黑压压的一片,在你执行find命令前,先执行一下这条命令,重新 grep 试试看
export GREP_OPTIONS='--color=auto'
好看多了,不是吗?
也可以这命令加入到bash_profile,以后就没必要每次搜索前都执行export GREP_OPTIONS='--color=auto'命令
你可以把 export GREP_OPTIONS='--color=auto' 这条命令添加到 ~/.bash_profile 或.bashrc文件(具体可自己进入自己用户目录下执行ls -al 查看)的最后,重新登录一下就能生效了
备注 .bash_profile 文件就在你当前用户目录下面:
[第1步] cd ~, [第二步] ll 或是ls -al
已可以看到该文件,但并不是每个人的电脑的是这个文件,当有没有这个文件时必要.bashrc 文件,将 export GREP_OPTIONS='--color=auto' 命令加入 .bashrc文件最后面即可,
grep -srn "cannot_connect_camera_new" //用此命令搜索
find -name "build.prop"|xargs rm -rf {}; 搜索当前目录下的所有build.prop文件并删除
find -name "*.xml"|xargs grep -nrws "config_systemUIServiceComponents"
解释:*.xml 只查找.xml文件,n是显示行数 r是忽悠大小写,
代码搜索
搜索指令 | 解释 |
---|---|
cgrep | 所有C/C++文件执行搜索操作 |
jgrep | 所有Java文件执行搜索操作 |
ggrep | 所有Gradle文件执行搜索操作 |
mangrep [keyword] | 所有AndroidManifest.xml文件执行搜索操作 |
mgrep [keyword] | 所有Android.mk文件执行搜索操作 |
sepgrep [keyword] | 所有sepolicy文件执行搜索操作 |
resgrep [keyword] | 所有本地res/*.xml文件执行搜索操作 |
sgrep [keyword] | 所有资源文件执行搜索操作 |
上述指令用法最终实现方式都是基于grep指令,各个指令用法格式:
xgrep [keyword] //x代表的是上表的搜索指令
例如,搜索所有AndroidManifest.xml文件中的launcher关键字所在文件的具体位置,指令
mangrep launcher
再如,搜索所有Java代码中包含zygote所在文件
jgrep zygote
又如,搜索所有system_app的selinux权限信息
sepgrep system_app
Tips: Android源码非常庞大,直接采用grep来搜索代码,不仅方法笨拙、浪费时间,而且搜索出很多无意义的混淆结果。根据具体需求,来选择合适的代码搜索指令,能节省代码搜索时间,提高搜索结果的精准度,方便定位目标代码。
在ubuntu中搜索文件一直是用的: find -name "*" |xargs grep “xxx",在用了一阵后感觉这命令还是太好,显示的搜索信息太多了,不匹配的搜索结果也显示在控件台中,百度了一下,可以用以下两个参数:
xxxx@ubuntu:~/project/MSM8916_R113502NEW/LINUX/android/packages$ find -name "*" |xargs grep -s "custom_content_page"
./apps/Launcher3/res/layout/custom_content_page_indicator_marker.xml: android:src="@drawable/custom_content_page"
./apps/Launcher3/res/layout/custom_content_page_indicator_marker.xml: android:src="@drawable/custom_content_page"
xxxx@ubuntu:~/project/MSM8916_R113502NEW/LINUX/android/packages$ find -name "*" |xargs grep -l "custom_content_page"
./apps/Launcher3/res/layout/custom_content_page_indicator_marker.xml
参数-s 与的-l的区别是 -s 会显示要搜索内容,而-l只会显示匹配搜索的文件名:
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
-w: 按单词搜索
-r: 逐层遍历目录查找
如果想查找当前目录(/home/student)下的tmp.txt文件,但是想要避开sep目录:
find /home/student -path /home/student/sep -prune -o -name "tmp.txt" -print
sep后面不能加/ 即/home/student/sep/是错误的 如果当前目录为/home/student 也可以这样
find . -path ./sep -prune -o -name "tmp.txt" -print
总结:-path 只是匹配find出来的路径,可以通过使用匹配符号* [] ?等 例如:
[student@bioeng ~]$ find . -name file
./file
./dir/file
./dir/dir555/file
./dir/dir2/file
./dir/dir1/file
[student@bioeng ~]$
[student@bioeng ~]$ find . -path "*dir[12]" -prune -o -name file -print
./file
./dir/file
./dir/dir555/file
[student@bioeng ~]$ [student@bioeng ~]$ find . -path "*dir*" -prune -o -name file -print
./file
[student@bioeng ~]$
如:搜索字符串“SystemUI”并排除out目录:
find . -path ./out -prune -o -type f -name "*.java" -print | xargs grep -swn "xxx"
find . -path ./out -prune -o -type f -print | xargs grep -swn "xxxx" 备注:w选项是精确查找
多关键字搜索:
find -name "*"|xargs grep -e 'sim|Sim'
grep "ro.mtk_hdmi_support" -nrw device/
grep -swnr xxx . //r代表递归查询 .表示当前目录
grep --exclude-dir=kernel --exclude-dir=out -swnr xxx // 忽略kerner out两个目录搜索
查找到替换字符串:
find . -path ./out -prune -o -name "*.java" -print0 | xargs -0 perl -pi -e 's/xxxx/xxxxtihuan/g' //替换将xxxx字符串搜索出来然后替换成:xxxxtihuan
其中find 命令的-print0选项一定要加,要不然会在替换的时候会提示文件打不开,