关于find和grep的问题

关于find和grep的问题

我正在编写一个小脚本来查找并计算众多文件和子目录中所有“the”的出现,然后我需要打印文件地址和“the”出现的次数。但我不知道如何完成它。

    find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\; 

ex.sh 程序的名称

txt 文件扩展名

寻找出现的单词

  • 正确的输出应该是:

    ./ex.sh txt the
    
    ./etext00/00ws110.txt 42764
    ./etext00/1cahe10.txt 26692
    ./etext00/1vkip11.txt 21895
    ./etext00/2cahe10.txt 24604
    ./etext00/2yb4m10.txt 15476
    ./etext00/8rbaa10.txt 3131
    
  • 我得到什么:

    ./etext00/00ws110.txt   35388
    ./etext00/1cahe10.txt   17905
    ./etext00/1vkip11.txt   14617
    ./etext00/2cahe10.txt   16971
    ./etext00/2yb4m10.txt   9938
    ./etext00/8rbaa10.txt   1839
    

    我假设它是包含“the”外观的行数,但在某些行中可能有超过 1 个“the”。

答案1

使用grep -o the并计算生成的行数:

find . -name "*.txt" -type f -printf "%p\t" \
    -exec sh -c 'grep -o "the" "$0" | wc -l' {} \; 

grep -o在单独的行上返回每一行上的每个匹配项(每个输出行返回一个匹配项)。

您可能还想使用-wiwithgrep来包含The(不区分大小写)和排除匹配,例如thein theory(全字匹配)。

答案2

由于您已经在使用 GNU 扩展 ( -printf),对于 GNU awk,您可以执行以下操作:

find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
   ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +

即用作txt记录分隔符,并在处理每个文件后报告记录数。但不要计算在最后一次出现 后可能(并且通常会)出现的额外记录txt

相关内容