0

我正在尝试用人类可读的时间戳替换字符串中的纪元时间戳。我知道如何将纪元转换为我需要的时间格式(并且一直在手动进行),尽管我无法弄清楚如何在字符串中替换它(通过脚本)。

字符串为文件名,如 XXXX-XXX-2011-01-25-3.6.2-record.pb。1296066338 .gz(纪元以粗体显示)。

我一直在使用以下 gawk 代码转换时间戳:

gawk '开始{打印 strftime("%Y%m%d.%k%M",1296243507)}'

我通常不熟悉 bash 脚本。任何人都可以在正确的方向上轻推我吗?

谢谢。

4

3 回答 3

2

你可以用这个

date -d '@1296066338' +'%Y%m%d.%k%M'

如果您不想调用 awk。

于 2011-01-31T00:19:19.633 回答
0

所有文件名的格式都相同吗?具体来说, ”。” + 纪元 + “.gz”?

如果是这样,您可以使用许多不同的路线。这是一个带 sed 的:

$ echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/'
1296066338

这样就可以提取纪元,然后将其发送到您的 gawk 命令。就像是:

#!/bin/bash

...
epoch=$( echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )

然后使用您想要替换文件名中的数字的任何方法。您可以再次通过 sed 发送它,但不是保存纪元,而是保存文件名的其他部分。

编辑:为了更好的衡量,我机器上的一个工作样本:

#!/bin/bash

filename="XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz"

epoch=$( echo ${filename} | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )

new_filename=$( echo ${filename} | sed "s/\(.*\.\)[0-9]\+\(\.gz\)/\1${readable_timestamp}\2/" )

echo ${new_filename}
于 2011-01-31T00:15:44.597 回答
0

您可以使用 Bash 的字符串操作和 AWK 的变量传递来避免必须进行任何调用sed或进行任何引号转义。

#!/bin/bash
file='XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz'
base=${file%.*.*}     #    XXXX-XXX-2011-01-25-3.6.2-record.pb
epoch=${file#$base}   #    1296066338.gz
epoch=${epoch%.*}     #    1296066338
# we can extract the extension similarly, unless it's safe to assume it's ".gz"
humantime=$(gawk -v "epoch=$epoch" 'BEGIN{print strftime("%Y%m%d.%k%M",epoch)}')
newname=$base.$humantime.gz
echo "$newname"

结果:

XXXX-XXX-2011-01-25-3.6.2-record.pb.20110126.1225.gz
于 2011-01-31T01:55:13.963 回答