暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

查找关键字工具findkw

codefan 2021-09-10
620

一.查找关键字工具findkw

日常开发中,数据库表删除/表字段修改后,如果代码里继续使用就会导致异常,使用工具去扫描代码检测废弃的表/字段是否存在代码里比依靠记忆要靠谱的多

二.findkw(find key word简称)支持的功能

  • 支持扫描指定的磁盘路径
  • 支持扫描指定的文本文件扩展名.txt/.xml/.json/.py/.go/.java等
  • 支持扫描多个关键字,以英文逗号分隔
  • 支持传入关键字文件(关键字过多,放入一个文件里面)
命令行参数 findtype 不传即可 =2的时候是特定查找
Usage of findkw:
  -endflag string
     文件扩展名 (default ".py")
  -f string
     检测目录目录 (default ".")
  -findtype string (default "1")
     =2的时候找含有$kw,不含z_etl.$kw的文件 
  -folder string
     检测目录目录 (default ".")
  -kwfile string
     关键字存放的文件
  -kws string
     检测的关键字 多个以逗号分隔 (default "zo_fund_basic")

三.demo

1.查找 /data/下所有python文件 包含 zo_fund_basic,zo_gp_basic关键字的文件:

./findkw -f /data/ --kws "zo_fund_basic,zo_gp_basic" -endflag ".py"


2.查找 /data/下所有go文件 包含 Unmarshal关键字的文件:

./findkw -f /data/ --kws "Unmarshal" -endflag ".go" |grep -v [0-9]


四.原理

1.递归遍历传入的folder参数(磁盘路径)
2.找到路径下所有扩展名以endflag参数为结尾的文件
3.读取文件内容content,对关键词列表循环,判断是否存在于content里,存在则输出,都不存在输出检测通过

五.使用go语言并发遍历目录

有个坑,服务器使用软连接的文件夹,os模块当成是一个普通文件不再遍历,因此递归文件目录使用了ioutil.ReadDir,对nextPath 继续递归函数

package findkw

import (
 "fmt"
 zeronewp "github.com/chengcxy/gotools/workpool"
 "io/ioutil"
 "path"
 "strings"
)

type CheckKw struct {
  Folder string
  Kws []string
  EndFlag string
  FindType string

}


func NewCheckKw(Folder,kws,EndFlag,KwFile,FindType string)*CheckKw{
 ck := &CheckKw{
   Folder:Folder,
   EndFlag:EndFlag,
   FindType:FindType,
 }
 if KwFile != ""{
   ck.getKwsByFile(KwFile)
 }else{
   Kws := make([]string,0)
   if strings.Contains(kws,","){
    Kws = strings.Split(kws,",")
   }else{
    Kws = append(Kws,kws)
   }
   ck.Kws = Kws
 }

 return ck
}

type Job struct {
  path string
  ck *CheckKw
  wp *zeronewp.WorkerPool
}

func NewJob(path string,ck *CheckKw,wp *zeronewp.WorkerPool)zeronewp.JobInterface{
  return &Job{
   path:path,
   ck:ck,
   wp:wp,
  }
}

type FindResult struct{
  File string
  Status int
  Kws string
  Msg string
}
func (job *Job)Executed()interface{}{
  contents, _ := ioutil.ReadFile(job.path)
  str := string(contents)
  for _,kw := range job.ck.Kws{
if job.ck.FindType == "1" {
    if strings.Contains(str,kw){
     fr := &FindResult{
      File:job.path,
      Status: 1,
      Msg:fmt.Sprintf("包含关键字:%s",kw),
     }
     job.wp.ResultChan <- fr
    }
   }else{
    if strings.Contains(str,kw) && !strings.Contains(str, fmt.Sprintf("z_etl.%s",kw)){
      fr := &FindResult{
       File:job.path,
       Status: 1,
       Msg:fmt.Sprintf("包含关键字:%s 不包含z_etl.%s",kw,kw),
      }
      job.wp.ResultChan <- fr
    }
    }
 }
 return nil
}


func (ck *CheckKw)ReadDir(folder string,JobChan chan zeronewp.JobInterface,wp *zeronewp.WorkerPool)error{
  if strings.HasSuffix(folder,ck.EndFlag){
   JobChan <- NewJob(folder,ck,wp)
  }
  fs,err := ioutil.ReadDir(folder)
  if err != nil{
   return err
  }
  for _,f := range fs{
   nextFolder := path.Join(folder,f.Name())
   ck.ReadDir(nextFolder,JobChan,wp)
  }
  return nil
}

func(ck *CheckKw)Run(){
  wp := zeronewp.NewWorkerPool(20)
  FuncProducerJob := func(JobChan chan zeronewp.JobInterface){
   defer func(){
    close(JobChan)
   }()
   ck.ReadDir(ck.Folder,JobChan,wp)
  }
  wp.Run(FuncProducerJob)
  rs := make([]*FindResult,0)
  for result := range wp.ResultChan{
   if result != nil{
    fr := result.(*FindResult)
    if fr.Status == 1{
     rs = append(rs,fr)
    }
   }
  }
 if len(rs)>0{
   for len(rs) >0 {
    fr := rs[0]
    rs = rs[1:]
    fmt.Printf("path:%s,%s \n",fr.File,fr.Msg)
   }
  }else{
   fmt.Println("经扫描,该目录下无文件占用查找的关键字")
 }


}

func (ck * CheckKw)getKwsByFile(KwFile string){
  contents, _ := ioutil.ReadFile(KwFile)
  strs := string(contents)
  kws := strings.Split(strs,"\n")
  for _,k := range kws{
   if len(k) > 0{
    ck.Kws = append(ck.Kws,k)
   }
 }
}




文章转载自codefan,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论