1

我有看起来像这些的线条

value: "15"

value: "20"

value: "3"

grepping 后我将其作为输入管道

... | grep value:

我需要的是一个简单的 bash 脚本,它使用这个管道并为我生成总和 15 + 20 + 3

所以我的命令是:

... | grep value: | calculate_sum_value > /tmp/sum.txt

sum.txt 应该包含一个数字,即总和。

我该如何处理 bash?我根本没有使用 bash 的经验。

4

2 回答 2

4

你可以试试awk。像这样的东西应该工作

... | grep value: | awk '{sum+=$2}END{print sum}'

你可以像这样一起避免 grep

.... | awk '/^value:/{sum+=$2}END{print sum}'

更新:

您可以使用该选项将"字符添加为字段分隔符。-F

... | awk -F\" '/^value:/{sum+=$2}END{print sum}'
于 2013-06-12T18:06:02.543 回答
3

我的第一次尝试是抓住冒号右边的东西,然后用 bash 求和:

$ sum=0
$ cat sample.txt | while IFS=: read key value; do ((sum += value)); done
bash: ((: "15": syntax error: operand expected (error token is ""15"")
bash: ((: "20": syntax error: operand expected (error token is ""20"")
bash: ((: "3": syntax error: operand expected (error token is ""3"")
0

因此,必须删除引号。好吧,使用一个花哨的 Perl 正则表达式来提取冒号右侧的第一组数字:

$ cat sample.txt | grep -oP ':\D+\K\d+'
15
20
3

好的,接下来:

$ cat sample.txt | grep -oP ':\D+\K\d+' | while read n; do ((sum+=n)); done; echo $sum
0

嗯?哦,是的,while在管道中运行会将修改汇总到子外壳中,而不是当前外壳中。好吧,也在子shell中做回声:

$ cat sample.txt | grep -oP ':\D+\K\d+' | { while read n; do ((sum+=n)); done; echo $sum; }
38

这样更好,但该值仍然不在当前 shell 中。让我们尝试一些更棘手的事情

$ set -- $(cat sample.txt | grep -oP ':\D+\K\d+')
$ sum=$(IFS=+; bc <<< "$*")
$ echo $sum
38

是的,UUOC,但它是 OP 管道的占位符。

于 2013-06-12T19:05:34.910 回答