首页 > 解决方案 > 根据linux中的时间戳获取一些字符串组合的计数

问题描述

抱歉,如果主题不是很清楚,下面我将尝试解释我的要求。我的服务器上每 15 分钟打印一次日志(实际上是 CDR 日志)。在日志中有 CDR(可以说它有大约 20 个用逗号分隔的字段)。在 cDR 中还会打印时间戳。下面是一个示例 cdr,

20-06-17 10:18:15,1637595323095*33659193263131331794958977243262t31,IVR,*886,724134931,1903-2-1|1901-2-0|1917-5-0|1902-2-0|1908-2-0|1911-5-0|,20-06-17 10:18:16,224,1902-2-0|1908-2-0,,

我正在使用以下命令来获取这些打印行的每小时计数,

cat logfile |grep -a "*886" | cut -d "," -f1 |cut -d ":" -f1 |sort -n |uniq -c

结果如下。

18 20-06-14 05
112 20-06-14 06
219 20-06-14 07
279 20-06-14 08
326 20-06-14 09
324 20-06-14 10
271 20-06-14 11
257 20-06-14 12

现在我碰巧需要每 15 分钟计数一次,有没有简单的方法来完成这项工作?

标签: linuxbashgrepcentoscut

解决方案


首先,无用的 cat。删除了一个无意义的过程。

其次,grep/cut/cut可以全部替换为单个sedor awk。四个过程现在减少到一个。

第三 - 我假设你正在阅读一个日志文件,第一个字段是时间戳,所以......他们不是已经按照正确的顺序了吗?没有它就不能正常工作sort吗?试试看。如果需要,请留下它,但我怀疑它可能不需要,这是另一个删除的过程。排序可能很昂贵。

所以充其量:

 sed -nE '/,*886,/{ s/^([0-9-]{8} [[0-9]{2}):.*/\1/; p; }' file | uniq -c

这应该更快。现在把它放到一个crontab中。

*/15 * * * * sed -nE '/,*886,/{ s/^([0-9-]{8} [[0-9]{2}):.*/\1/; p; }' /path/to/logfile | uniq -c >| /path/to/report.tmp; mv /path/to/report.tmp /path/to/report;

这应该每 15m 重新创建一次报告。


推荐阅读