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

Bash 使用命令行在文件中搜索关键字列表?,bash,perl,command-line,ssh,command,Bash,Perl,Command Line,Ssh,Command,我在txt文件中有一个关键字列表,如下所示: keyword1 keyword2 keyword3 我需要搜索我的所有文件-除了HTML和CSS文件-这些关键字 我唯一需要知道的是哪个关键字没有出现在任何文件中。我不在乎做什么或他们在什么文件。我只需要知道哪些关键字不在任何文件中 我查找的所有内容都会返回关于如何查找关键字和输出它们所在文件的结果。我愿意通过命令行、Perl或任何最简单的方法来实现这一点 看起来这些命令可以用于查找不包含“我的关键字”的文件: grep -L "foo" *

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

keyword1
keyword2
keyword3
我需要搜索我的所有文件-除了HTML和CSS文件-这些关键字

我唯一需要知道的是哪个关键字没有出现在任何文件中。我不在乎做什么或他们在什么文件。我只需要知道哪些关键字不在任何文件中

我查找的所有内容都会返回关于如何查找关键字和输出它们所在文件的结果。我愿意通过命令行、Perl或任何最简单的方法来实现这一点

看起来这些命令可以用于查找不包含“我的关键字”的文件:

grep -L "foo" *

但是我不知道如何从我的txt文件中提取关键字,或者如何让它搜索除.html或.css之外的所有文件


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

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

  • HTML文件扩展名为.HTML(注意:它可以有.htm.htm、.HTML 扩展,我只是假设其中一个,请调整答案以适应 (你的情况)
  • CSS文件具有.CSS扩展名(同样,它可能具有.CSS扩展名)
  • 您可以轻松地将关键字放入grep命令中,即没有 特殊正则表达式字符,例如“^”表示开始 在行匹配中,“$”表示行匹配的结束
  • 您正在尝试搜索a文件夹及其子文件夹下的文件 子文件夹
  • 假设您的关键字文件是../keywordfile.txt。注:自当前起 假设进行文件夹搜索,则无法将您的keywordfile.txt放入 否则,搜索keywordfile.txt本身将生成当前文件夹 所有匹配项,将不输出任何内容(因为每个关键字都匹配)
  • 现在是一种快速而肮脏的方法:

    #!/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
    
    #/bin/bash
    TMP=/TMP/filelist$$.txt
    找到-键入f | grep-v.html$“| grep-v.css$”>$TMP
    ##注意:如果只搜索当前文件夹而不搜索子文件夹,
    ##将“-maxdepth 1”选项添加到“find”命令
    同时读取关键字;做
    if[`在读取文件时;do\
    cat“$file”\
    完成<$TMP| grep-c“$keyword”`-eq 0];然后\
    echo“$关键字不会出现在任何文件中。”\
    fi\
    完成<../keywordfile.txt
    
    试试这个:

    #!/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
    

    刚刚用代码更新。注意:您必须将此脚本放在要搜索的文件夹之外的其他文件夹中,否则,此脚本也会被搜索您的关键字!下面是我得到的错误:
    :command not found:command not found search.sh:line 14:unexpected token附近的语法错误
    done'search.sh:line 14:
    done
    看起来您的bash很旧,不支持某些多行语法。因此,我添加了一些
    '和
    \
    '限制:带有尾随空格的文件名不起作用。带前导空格或中间空格的文件名应为OK。
    #!/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