【问题标题】:Grep dates from file and format them从文件中提取日期并格式化它们
【发布时间】:2021-05-15 01:58:37
【问题描述】:

我有一个看起来像这样的文件“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

帮助表示赞赏!

【问题讨论】:

  • date 可能假设为 MM/DD/YYYY。尝试先调试日期:date --debug -d "06/26/2021 15:15:15 4 hours" +%s
  • perl -MPOSIX -nE 'while (m{(\d\d)/(\d\d)/(\d{4}) (\d\d):(\d\d):(\d\d)}g){ say strftime("%s",$6,$5,($4+4),$1,$2,($3-1900)) }' tmp.txt
  • 谢谢@jhnc!有没有办法每次用时间戳而不是初始日期打印行的其余部分?
  • 顺便说一句,我对结果有疑问。我已经测试将 +4 替换为 +6 以额外测试 6 小时,它返回 1627240515 但结果应该是 1624648515

标签: bash date debian


【解决方案1】:

久经考验的最小解决方案

您可以使用以下命令行来获得所需的结果。我已经用您的示例对其进行了测试,它在我的 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

我用接近午夜时间、闰年等边缘情况对其进行了测试,效果很好

【讨论】:

  • 感谢您的帮助和建议!我想将日期显示为时间戳(秒),因此我将“+'%Y-%m-%d %H:%M:%S'”替换为“%s”。
【解决方案2】:

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

$ 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($1, "%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}).*}
           {$2/$1/$3 +4 hours $4}
' 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多