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

如何编写Shell脚本计算文件中nmemb:()内数字的总和?

计算nmemb括号内数字总和的命令行方案

问题场景

我有一个名为X的文件,其中包含大量如nmemb:(123)、nmemb:(56789)格式的内容。已通过命令cat X | grep -o 'nmemb[^_]*$'提取出如下格式的行:

nmemb:(16384)
nmemb:(16384)
nmemb:(16384)
nmemb:(5608)
nmemb:(10776)
nmemb:(16384)
nmemb:(16384)
nmemb:(16384)
nmemb:(16384)
nmemb:(16384)

需要编写后续处理逻辑,计算这些行中nmemb:()括号内数字的总和,实现类似cat X | grep -o 'nmemb[^_]*$' | doSumBetweenBracket()的效果。


方案1:用awk(最简洁高效)

直接用awk提取括号内数字并累加,一步完成:

cat X | grep -o 'nmemb[^_]*$' | awk -F'[()]' '{sum+=$2} END {print sum}'

嫌管道多的话,还能把grep和awk合并,减少进程:

awk '/nmemb:[0-9()]+$/ {split($0, a, /[()]/); sum+=a[2]} END {print sum}' X

原理:用[()]作为分隔符,每行拆分后第二个字段就是括号里的数字,累加后最后输出总和。

方案2:用sed+bc组合

先通过sed提取纯数字,再用bc做加法:

cat X | grep -o 'nmemb[^_]*$' | sed 's/.*(\([0-9]*\)).*/\1/' | paste -sd+ - | bc

原理:sed把每行替换成括号内的数字,paste -sd+ -把所有数字用加号连起来,最后交给bc计算总和。

方案3:用perl处理

用perl的正则匹配提取数字并累加:

cat X | grep -o 'nmemb[^_]*$' | perl -nle '$sum += $1 if /\((\d+)\)/; END {print $sum}'

原理:perl逐行读取内容,匹配括号内的数字并加到sum变量里,最后输出总和。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:20:22