grep与find区别

  1. grep:查找指定目录下过滤文本文件中行数据
  2. 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查看不显示指定内容 grep只显示行号_当前目录

 

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 :打印数据