增加数字&使用sed语法进行计数

时间:2016-06-26 03:21:05

标签: bash time sed syntax increment

我试图把头包裹在sed周围,并认为最好尝试使用简单但有用的东西。在工作中,我希望每次用户运行特定脚本时都要依赖小型LCD显示屏。我目前正在使用以下语法进行总计数:

oldnum=`cut -d ':' -f2 TotalCount.txt`
newnum=`expr $oldnum + 1`
sed -i "s/$oldnum\$/$newnum/g" TotalCount.txt

这会修改包含这一行的文件:

  

总录音:0

现在我想详细说明一下,从午夜开始递增数字,并在每天23:59:59重置为零。我创建了一个辅助.txt文件供显示器读取,其中只有一行:

  

今日录制总数:0

但语法不一样。如何更改上述sed语法以更改第二个文件的对话框中的数字?

我可以使用sed / bash和计划中的简单cron作业来更改和重置文件。问题是我无法弄清楚sed的语法来复制与我最初工作时相同的效果。任何人都可以帮忙,我已经阅读了几个小时,最后决定发布这个,只是煮一壶咖啡。我有一个4行液晶显示器,如果能够轻松学习语法,我很乐意跟踪计划中的计数。

3 个答案:

答案 0 :(得分:1)

sed应该可以正常处理您文件中Total Recordings:Total Recordings Today:的增量,因为它正在寻找相同的模式。要在某个时间每天重置它,我会推荐一个cronjob。

0 0 * * * echo \"Total Recordings Today:0\" > /path/to/TotalCount.txt >/dev/null 2>&1

我鼓励的其他事情是使用较新的样式语法$( ... )进行shell扩展,并为TotalCount.txt文件创建一个变量。

#!/bin/bash

totals=/path/to/TotalCount.txt
oldnum=$(cut -d ':' -f2 "$totals")
newnum=$((oldnum + 1))
sed -i "s/$oldnum\$/$newnum/g" "$totals"

通过这种方式,您可以轻松地将其重复用于您想要使用它的任何其他内容,正确引用它并简化您的代码。注意:在OS X上,sed inplace扩展需要sed -i ''

如果有疑问,http://shellcheck.net是一个非常好的工具,可以帮助您找到代码中的错误。

答案 1 :(得分:1)

虽然您正在寻找sed解决方案,但无法拒绝发布如何在awk中完成

$ awk -F: -v OFS=: '{$2++}1' file > temp && temp > file

-F:将输入字段分隔符和-v OFS=:输出字段分隔符设置为:awk解析第二个字段并递增1,1是打印速记(可以替换为任何“真实”值);输出将写入临时文件,如果成功将覆盖原始输入文件(模仿就地编辑)。

答案 2 :(得分:0)

Sed是一个很好的工具,但众所周知不是最好的算术。如果文件今天没有上次修改(或者不存在),你可以通过在递增计数器之前将计数器初始化为零来制作你已经有的工作:

[ `date +%Y-%m-%d` != "`stat --printf %z TotalCount.txt 2> /dev/null|cut -d ' ' -f 1`" ] && echo "Total Recordings Today:0" > TotalCount.txt

为了对班次做同样的事情,您可能会计算班次"序数"通过减去自午夜(即午夜)以来的秒数(例如7 * 3600)开始的第一班次开始并除以班次长度(8 * 3600)并初始化计数器(如果改变)。类似的东西:

[ $(((`date +%s` - 7 * 3600) / (8 * 3600))) -gt $(((`stat --printf %Z TotalCount.txt 2> /dev/null` - 7 * 3600) / (8 * 3600))) ] && echo "Total Recordings This Shift:0" > TotalCount.txt