2017-03-01 45 views
0

我试图实现下面的FAKE代码所示的功能:计算净减速率并更新净日志。 可能有人向我展示正确的代码?谢谢。如何将linux shell变量写入文件的给定行?

#!/bin/bash 
    #check_net.sh 

    net_link_error_total=33 
    net_link_ok_total=55 
    save_link_rate() 
    { 
     sed -i '1 cnet_link_error_total=$net_link_error_total' yy.log 
     sed -i '2 cnet_link_ok_total=$net_link_ok_total' yy.log 

     net_link_ok_rate=net_link_ok_total/(net_link_ok_total+net_link_error_total) * 100% 
     sed -e "3c net_link_ok_rate= /$net_link_ok_rate" yy.log  
    } 

    save_link_rate 

我执行sed -i '2 cnet_link_ok_total=$net_link_ok_total' yy.log

  • 后yy.log是net_link_error_total=$net_link_error_total

  • ,但我想它是net_link_error_total=33

回答

1

在前两个sed命令中,变量不会在单引号内扩展。

将最后一个命令应用于第三行将按预期工作,但将扩展限制为仅变量并且不要将整个sed命令括在双引号内是一种好习惯。而且我会为每可读性sed的c命令后加上一个空格:

sed -i '1c net_link_error_total='"$net_link_error_total"'' yy.log 
sed -i '2c net_link_ok_total='"$net_link_ok_total"'' yy.log 

sed -e '3c net_link_ok_rate= /'"$net_link_ok_rate"'' yy.log 

而且你的速度计算是错误的。您可以使用bc此:

net_link_ok_rate=$(echo "scale=2; $net_link_ok_total/($net_link_ok_total+$net_link_error_total) * 100" | bc) 

最后请注意,你的最后一个sed命令的文件将不到位的进行编辑,因为-i标志丢失。

+0

行'net_link_ok_rate = net_link_ok_total /(net_link_ok_total + net_link_error_total )* 100% '不应该工作正确吗?它不是在算术语境中完成的,不是吗?或者我在这里错过了什么? – Inian

+0

前两行看起来不错。 –

+0

@BeyondOcean前两行?如果你的意思是前两个sed命令,它们不是。这就是为什么你没有看到预期的替代品。 – SLePort

0

使用双引号而不是单引号,因为单引号会限制变量的替换。在你的情况,你想要的是:

sed -i "1 cnet_link_error_total=$net_link_error_total" yy.log 
sed -i "2 cnet_link_ok_total=$net_link_ok_total" yy.log 

如果你想要做一个浮动师bash,你应该使用的工具如bc。在你的情况,例如:

ok_rate=$(echo "scale=2; $ok_total/$((ok_total+error_total))" | bc) 
0

如果你有GNU AWK与就地模块(4.1.0及以上版本),则:

awk -i inplace -v error=$net_link_error_total -v ok=$net_link_ok_total \ 
    'NR == 1 {$0 = "net_link_error_total=" error} 
    NR == 2 {$0 = "net_link_ok_total=" ok} 
    NR == 3 {$0 = "net_link_ok_rate=" (ok + error)*100/ok} 
    1' yy.log 

$0是当前行, NR的行号,所以我将每个匹配行设置为所需的字符串。

如果字段名都已经在这些文件中的行,你可以进一步简化,但设置字段,而不是整条生产线的:

awk -i inplace -F= -v error=$net_link_error_total -v ok=$net_link_ok_total \ 
    'NR == 1 {$2 = error} 
    NR == 2 {$2 = ok} 
    NR == 3 {$2 = (ok + error)*100/ok} 
    1' yy.log