如何用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
相关产品推荐
相关产品推荐

