Grep 文件中的日期并格式化它们

Grep dates from file and format them

我有一个文件“tmp.txt”看起来像这样:

random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15

我想:

  1. 提取所有日期时间
  2. 增加 4 小时
  3. 将它们显示为时间戳

我还不知道如何添加小时,因为我遇到了日期函数无法识别日期格式的问题。

(如果可能的话,我希望能够用一行命令来完成)

这是我当前的命令:

egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line ; do echo $(date -d  "$line" +%s);done

感谢帮助!

让我调整时间戳以使输出更有趣:

$ cat tmp.txt
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 20:15:15
random text random text 26/06/2021 23:15:15

@jhnc 的想法是正确的:使用一种既擅长文本操作又能进行日期算术的语言。我会使用 Time::Piece

perl -MTime::Piece -lne '
    m{(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d)} or continue;
    $t = Time::Piece->strptime(, "%d/%m/%Y %T");
    $t += 4 * 3600;
    print $t->strftime("%F %T")
' tmp.txt
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15

或者,这里是 perl 管道到 xargs 的日期内容

perl -pe 's{.*(\d{2})/(\d{2})/(\d{4}) (\d{2}:\d{2}:\d{2}).*}
           {// +4 hours }
' tmp.txt | xargs -I DT date -d DT '+%F %T'
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15

久经考验的最小解决方案

您可以使用以下命令行来获得所需的结果。我已经用您的示例对其进行了测试,它在我的 Linux 机器上按预期工作。

egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line; do dd=${line:0:2}; mm=${line:3:2}; yyyy=${line:6:4}; time=${line:11:8}; date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S'; done

我将其分成多行以便于理解:

egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt \
| \
while read -r line; do
# Reading date and time into separate variables
dd=${line:0:2};
mm=${line:3:2};
yyyy=${line:6:4};
time=${line:11:8};
# Adding 4 hours and displaying datetime in desired format
date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S';
done

要增加 4 小时,您可以在 -d 选项中的日期时间之后提及它,如上所示,我尝试了小时、分钟和天,它按预期工作

对于您的输入文件 tmp.txt:

random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15

在 运行 我的命令上,输出是:

2021-06-25 19:15:15
2021-06-26 19:15:15
2021-06-26 19:15:15

我用接近午夜时间、闰年等极端情况对其进行了测试,它运行良好