在GC日志中,每行的开头都有时间戳。但有时我们会错过这一点。
我正在寻找编写bash脚本,以检查是否缺少时间戳,它将在开始时添加一些静态时间戳。
在下面的示例中,有2行。第一行有时间戳,但第二行没有时间戳。
2018-11-22T11:58:39.381+0100: 79412.217: [GC (Allocation Failure) 2018-11-22T11:58:39.381+0100: 79412.217: [ParNew: 1265865K->36835K(1380160K), 0.1419160 secs] 23560553K->22332825K(29206784K), 0.1421816 secs] [Times: user=2.39 sys=0.00, real=0.14 secs]
79412.947: [GC (Allocation Failure) 2018-11-22T11:58:40.112+0100: 79412.947: [ParNew: 1263651K->36868K(1380160K), 0.1502318 secs] 23559641K->22334516K(29206784K), 0.1504887 secs] [Times: user=2.47 sys=0.00, real=0.15 secs]
例如在第二行:79412.947 + 153434343 =某个值。将该值转换为时间戳格式,并附加在开头。
正则表达式以提取时间戳。 https://regex101.com/r/3CtU4y/1/
任何建议,都会提供有益的建议。预先谢谢你。
答案 0 :(得分:1)
第一个建议是,如果您有很多日志记录,bash可能不是您的最佳选择。
此外,编写脚本非常符合要求。它将是:
1)建立一个循环以读取输入行
#!/bin/bash
cat $* | while read line ; do
2)测试输入行是否以时间戳开头(不要费心查找您提供的正则表达式。
if echo "$line " | grep '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]' ; then
true
请注意,如果条件为true,grep
将输出该行,因此不需要单独的回显。
3)否则,用纪元时间戳做一些我不太了解您想要什么的事情:
else
estamp=$(echo "$line" | sed 's/:.*//')
rol=$(echo "$line" | sed 's/[0-9.]*://)
# Do something with adding to the timestamp that I did not grasp
echo "$estamp:$rol"
fi
或者类似的东西。
是的,关闭循环
done