使用命令行在文件中搜索关键字列表?

时间:2014-11-05 06:28:35

标签: bash perl command-line ssh command

我在txt文件中有一个关键字列表,如下所示:

keyword1
keyword2
keyword3

我需要为这些关键字搜索我的所有文件 - 除了HTML和CSS文件外。

我唯一需要知道的是关键字DON&#T; T出现在任何文件中。我不关心那些做什么或者他们在哪些文件。我只需要知道哪些关键字不在任何文件中。

我查找过的所有内容都会继续提供有关如何查找关键字并输出其所在文件的结果。我可以通过命令行,Perl或任何最简单的方式执行此操作完成它。

看起来这些命令应该用于查找不包含我的关键字的文件:

grep -L "foo" *

ack -L "foo" *

但我不知道如何从我的txt文件中提取关键字或如何使其搜索除.html或.css以外的所有文件

我在我的服务器上运行此操作,因此我并不太关心它的资源密集程度......

2 个答案:

答案 0 :(得分:0)

由于您的描述不完整,我将假设以下内容:

  1. HTML文件的扩展名为.html(注意:它可能有.htm .HTM,.HTML 扩展,我只是假设他们,请调整适合的答案 你的情况)
  2. CSS文件具有.css扩展名(同样,它可能具有.CSS扩展名)
  3. 你可以很容易地将关键字放入grep命令,即没有 特殊的正​​则表达式字符,例如" ^"意味着开始 一场比赛," $"表示行匹配结束。
  4. 您正在尝试搜索文件夹及其下的文件 子目录。
  5. 假设您的关键字文件是../keywordfile.txt。注意:从目前开始 假定文件夹搜索,您的keywordfile.txt无法放入 当前文件夹,否则,搜索keywordfile.txt本身会产生 所有匹配,并且不会输出任何内容(因为每个关键字都匹配)
  6. 现在这是一种快速而肮脏的方式:

    #!/bin/bash
    TMP=/tmp/filelist$$.txt
    find . -type f | grep -v ".html$" | grep -v ".css$" > $TMP
    
    ## Note: if you are search only current fold but not subfolders,
    ## add "-maxdepth 1" option to "find" command
    
    while read keyword; do
        if [ `while read file; do \
             cat "$file"; \
             done < $TMP | grep -c "$keyword"` -eq 0 ]; then \
          echo "$keyword does not appear in any files."; \
        fi; \
    done < ../keywordfile.txt
    

答案 1 :(得分:0)

试试这个:

#!/bin/bash 

keywordlist=$(cat keywordfile.txt | tr "\n" "\|")
for x in $(find . ! -name "*.html" ! -name "*.css" -type f) 
do 
  if ! grep -qE "(${keywordlist%"|"})" $x
  then 
    echo $x
  fi
done