linux - 根据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 分钟计数一次,有没有简单的方法来完成这项工作?
解决方案
首先,无用的 cat。删除了一个无意义的过程。
其次,grep/cut/cut
可以全部替换为单个sed
or 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 重新创建一次报告。
推荐阅读
- android - 双击自定义视图打开 2 个活动
- java - 找到没有的阶乘。它工作正常,但我无法理解为什么它给我阶乘 0 表示没有 56、89、77 和其他一些数字
- angular - 检测 @Input 属性角度 4 的内部变化
- extjs - 如何为 extjs 网格中的列定义自定义工具提示?
- android - 如何在android studio中创建这样的导航菜单?
- python - 如何通过 Juno 将 Pandas 导入 iPad 上的 Jupyter 笔记本?
- web-services - 是否可以在 Debian 9.4 中安装 freeswitch?
- node.js - node.js bcrypt 比较即使在我散列之后也返回 false
- hyperledger - 超级账本作曲家游乐场如何实现“所有交易”?
- android - Flutter 键盘使文本字段隐藏