有没有办法管道包含一堆epoch / unix时间戳值的内容,并查看将datetime值转换为人类可读形式的文本,如:
$ cat data.txt
{
"id": "20a68337-922b-4db0-85d6-719c97e0ee83",
"published_at": 1457427709695,
"expires": 1458346544
}
$ cat data.txt | convert-datetimes
{
"id": "20a68337-922b-4db0-85d6-719c97e0ee83",
"published_at": Tue, 08 Mar 2016 09:01:49.695 GMT,
"expires": Wed, 18 May 2016 23:42:21 GMT
}
答案 0 :(得分:4)
这基本上是一个定义不明确的问题,因为时间戳只是数字,任何数字都对应某些时间。因此,您必须为哪些值是合理的时间戳定义一些启发式方法。
一旦你有了这样的启发式,如果你不想保留输入的结构(在你的例子中是JSON),只需要采用你喜欢的文本替换语言并实现它。例如,我们可以假设任何具有正确位数(毫秒或秒)的数字都可以。
当然,正确的位数会随着时间的推移而变化,但直到2286年它才会增加,我希望这会很久就会过时。
的Python:
import re, sys, time
def reformat(match):
timestamp = int(match.group(1))
if timestamp >= 1e12:
timestamp /= 1000.0
return time.asctime(time.gmtime(timestamp))
for line in sys.stdin:
sys.stdout.write(re.sub(r"\b(\d{10,14})\b", reformat, line))
Perl 5:
while (<>) {
s/\b(\d{10,12})\b/gmtime $1/ge;
s!\b(\d{13,14})\b!gmtime($1 / 1000)!ge;
print;
}
改进:
如果你知道你期望看到的时间戳,例如它们都在当前时间的某个范围内,那么你可以添加一个条件(在替换函数中),返回原始字符串未编辑如果数值超出范围。
您可以收紧正则表达式以检查附近的字符,例如使用&#34; - &#34;在它之前。
如果输入实际上是JSON或其他结构化语法,您实际上可以解析输入并仅查找您期望它们的时间戳(或者通常,就像不匹配任何字符串值内的数字一样)。