You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell命令统计目录下所有XML文件中指定单词的出现次数?

问题:统计目录下所有XML文件中特定单词的出现次数

我有一个包含大量文件的目录,希望用一条Shell命令显示该目录下所有XML文件,以及每个文件中特定单词的出现次数,格式如下:

file1.xml 333
file2.xml 525
...
file67.xml 767

单个文件的统计命令我已经写好:

grep -w WORD FILE.XML | wc -l

但对目录下所有XML文件执行统计时遇到问题,尝试的命令如下:

find . -name "*.xml" -exec grep -w WORD {} | wc -l +

报错信息:

wc: +: Aucun fichier ou dossier de ce type
find: missing argument to `-exec'

请问如何修正这条命令?


解决方案

1. 用grep直接实现(最简洁)

grep自带递归和计数功能,无需依赖find,一行命令即可完成需求:

grep -wr -c "WORD" --include="*.xml" .

参数说明:

  • -r:递归遍历当前目录及子目录
  • -c:输出每个文件中匹配的次数
  • -w:匹配完整单词(避免部分匹配)
  • --include="*.xml":仅处理XML格式文件

2. 修正find + -exec的写法

你原命令的问题在于管道|被当前Shell提前解析,没有传递给find的-exec参数。需要将管道命令包裹在子Shell中执行:

单文件逐个处理

find . -name "*.xml" -exec sh -c 'grep -w "WORD" "$1" | wc -l' _ {} \;

这里_是占位符,对应sh -c脚本中的$0,{}会被替换为每个找到的XML文件路径。

批量处理提高效率

如果文件数量极多,用+代替\;可以批量传递文件,减少进程创建开销:

find . -name "*.xml" -exec sh -c 'for f do grep -w "WORD" "$f" | wc -l; done' _ {} +

3. 用awk自定义输出格式

如果需要更灵活的格式控制,可直接用awk完成匹配和计数:

find . -name "*.xml" -exec awk -v target_word="WORD" '
    /\<target_word\>/ { count++ }
    END { print FILENAME, count }
' {} \;

其中\<和\>是awk的整词匹配边界,效果等同于grep -w。


内容的提问来源于stack exchange,提问作者Autechre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:25:17