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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:57:03