如何在Bash中统计指定字符串出现次数并整合现有文件统计结果
解决方案
核心思路
通过find定位目标文件,结合bash子脚本处理单个文件,同时用wc统计总行数、grep统计指定字符串的出现次数,最后整合结果并排序。
直接可用的命令(字符串硬编码版)
find . -type f -name "*usc*.vhd" -exec bash -c ' file="$1" # 获取文件总行数 total_lines=$(wc -l < "$file") # 定义需要统计的字符串列表 target_strings=("end component" "end process" "signal" "variable") # 输出文件名+总行数 printf "%-40s %8d" "$file" "$total_lines" # 遍历每个字符串,统计并输出次数 for str in "${target_strings[@]}"; do match_count=$(grep -c -F "$str" "$file") printf " %8d" "$match_count" done printf "\n" ' _ {} \; | sort -k2,2rn | column -t
可灵活调整的版本(字符串存文件)
如果需要频繁修改字符串列表,建议把字符串写入单独文件(比如strings.txt,每行一个字符串):
# strings.txt 内容示例 end component end process signal variable
对应的命令:
find . -type f -name "*usc*.vhd" -exec bash -c ' file="$1" total_lines=$(wc -l < "$file") printf "%-40s %8d" "$file" "$total_lines" # 从文件读取字符串并统计 while IFS= read -r str; do match_count=$(grep -c -F "$str" "$file") printf " %8d" "$match_count" done < strings.txt printf "\n" ' _ {} \; | sort -k2,2rn | column -t
关键参数说明
grep -c -F "$str":-c统计匹配次数,-F将字符串视为固定文本而非正则表达式,避免特殊字符干扰匹配精度。wc -l < "$file":比wc -l "$file"更高效,仅输出行数数字,无需处理文件名。sort -k2,2rn:按第二列(总行数)降序排序。column -t:自动对齐输出列,让结果更易读。
调整说明
- 若需要忽略大小写匹配,给
grep添加-i参数即可。 - 修改字符串列表时,直接编辑
target_strings数组或strings.txt文件即可。
内容的提问来源于stack exchange,提问作者quantum231
相关产品推荐
相关产品推荐

