我正在编写一个小脚本来查找并计算众多文件和子目录中所有“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
在单独的行上返回每一行上的每个匹配项(每个输出行返回一个匹配项)。
您可能还想使用-wi
withgrep
来包含The
(不区分大小写)和排除匹配,例如the
in 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
。