如何用BASH的tee命令单次扫描大文件并将匹配行数存入变量
解决方案
需求完全可以实现,你之前写法失效的核心原因是:Bash 的进程替换(>() 语法)内部的代码运行在独立子shell环境,子shell内赋值的变量不会同步到父shell,因此外部无法读取到FIRST和SECOND的取值。
正确实现代码
# 先清理历史变量值 unset FIRST SECOND # 单次扫描文件,统计结果写入父shell变量 while read -r cnt type; do case "${type}" in first) FIRST="${cnt}" ;; second) SECOND="${cnt}" ;; esac done < <( tee \ >(grep -c 'first example' | sed 's/$/ first/') \ >(grep -c 'second example' | sed 's/$/ second/') \ < test.txt \ > /dev/null )
验证结果
执行完成后打印变量即可得到正确计数:
echo $FIRST # 输出 3 echo $SECOND # 输出 2
实现说明
- 全程仅扫描
test.txt一次,无临时文件生成,未使用awk工具 - 用
grep -c直接输出匹配行数,省去额外调用wc的开销 - 给每个统计结果加上唯一标识后缀,解决子进程执行速度不一致导致的输出顺序混乱问题
- 所有统计结果通过进程替换直接导入父shell的循环结构赋值,避开子shell变量隔离限制
内容的提问来源于stack exchange,提问作者edwardsmarkf
相关产品推荐
相关产品推荐

