awk 时间查找

awk 时间查找

我在 Linux 上有一个文本文件,我想使用 awk 更改日期部分并放入当前日期。当然,我写了这个并且它有效,但是我必须手动给它日期,我想要的是它自动替换当天的日期。

代码 :

awk '{gsub(/ISODate\(\"[0-9][0-9][0-9][0-9][-][0-9][0-9][-][0-9][0-9]/,"ISODate(\"2022-10-02");print}' rasoul-02.json

答案1

有多种方法可以获取今天日期的 ISO 格式。

  • 使用外部命令:date +'%F'
  • 使用 shell 命令:printf '%(%F)T\n' -1
  • 在某些 awk 版本中:strftime("%F")

最通用(便携式)的解决方案是使用date

awk '{gsub(/ISODate\([0-9]{4}([-][0-9]{2}){2}\)/,"ISODate("isodate")")}1
    ' isodate=$(date +'%F') rasoul-02.json

使用 shell 内部日期格式的可能解决方案是:

$ printf -v isodate '%(%F)T' '-1';
$ awk '{gsub(/ISODate[(]["][0-9]{4}([-][0-9]{2}){2}["][)]/,"ISODate(===\""isodate"\")")}1
      ' isodate=$isodate rasoul-02.json

并使用strftimeGNU awk 的功能(和其他一些):

awk '{ gsub( /ISODate[(]["][0-9]{4}([-][0-9]{2}){2}["][)]/ , "ISODate(\"" strftime("%F") "\")" )}1
      ' rasoul-02.json

答案2

您可以将日期awk作为变量传递:

awk -v date="$(date +%F)" '{gsub(/ISODate\("[0-9][0-9][0-9][0-9][-][0-9][0-9][-][0-9][0-9]/,"ISODate(\""date"\"");print}'

如果您可以使用 GNU awk ( gawk),您还可以显着简化您的正则表达式:

gawk -v date="$(date +%F)" '{
    gsub(/ISODate\("[0-9]{4}-[0-9]{2}-[0-9]{2}/,"ISODate(\""date);
    print
}' rasoul-02.json

然而,这都是一个非常糟糕的主意。如果您正在使用 JSON 文件,那么有类似的专用 JSON 解析器jq可以以更安全、更简单的方式完成此操作。我强烈建议您发布实际文件,以便我们提供更好的答案。

相关内容