在缺少时间戳的情况下在每行中追加时间戳的脚本

时间:2018-11-22 18:47:27

标签: bash timestamp

在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] 
  1. 主要要求是在每行缺少时添加时间戳。
  2. 高级:在没有时间戳的情况下,以纪元格式存在一个相对时间(79412.947)。我希望在每个相对时间上添加一些静态纪元时间,并在开始时追加。

例如在第二行:79412.947 + 153434343 =某个值。将该值转换为时间戳格式,并附加在开头。

正则表达式以提取时间戳。 https://regex101.com/r/3CtU4y/1/

任何建议,都会提供有益的建议。预先谢谢你。

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