bash脚本,如何解析用以下分隔的字符串:

时间:2013-06-12 18:02:52

标签: bash shell scripting

我的行看起来像这些

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的经验。

2 个答案:

答案 0 :(得分: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}'

答案 1 :(得分: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中,而不是在当前shell中。那么,也要在子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的管道是什么,它都是占位符。