如何将完整的unix时间字符串文件转换为人类可读日期?

时间:2010-05-17 14:16:17

标签: perl bash unix-timestamp

我正在处理一个充满unix时间字符串的文件。我想将它们全部转换成人类可读的。

文件如下:

1153335401
1153448586
1153476729
1153494310
1153603662
1153640211

这是脚本:

#! /bin/bash
FILE="test.txt"
cat $FILE | while read line; do
perl -e 'print scalar(gmtime($line)), "\n"'
done

这不起作用。我获得的输出是每行 Thu Jan 1 00:00:00 1970 。我认为线路中断正在被接收,这就是它无法正常工作的原因。有任何想法吗?我使用Mac OSX是有所不同的。

9 个答案:

答案 0 :(得分:9)

$ perl -lne 'print scalar gmtime $_' test.txt
Wed Jul 19 18:56:41 2006
Fri Jul 21 02:23:06 2006
Fri Jul 21 10:12:09 2006
Fri Jul 21 15:05:10 2006
Sat Jul 22 21:27:42 2006
Sun Jul 23 07:36:51 2006

答案 1 :(得分:3)

因为$line是单引号,所以它不会被bash处理,因此$line被视为(未定义的)Perl变量而不是bash变量。

您不需要while read bash循环; Perl可以使用-n选项自行循环。

perl -nE 'say scalar(gmtime($_))' test.txt

(使用-E启用say,它会自动附加换行符)

答案 2 :(得分:1)

请勿使用cat

#! /bin/bash
file="test.txt"
while read line
do
    date -d @$line
done < "$file"

答案 3 :(得分:1)

这不是换行符,而是Perl脚本中的$line是与bash脚本中的$line不同的变量。你可以尝试:

perl -e "print scalar(gmtime($line)),qq/\\n/"

注意双引号,它允许bash进行变量插值。

答案 4 :(得分:0)

不需要Perl:

awk '{ print strftime("%c", $0) }' somefile.txt

答案 5 :(得分:0)

问题是你没有为$line变量分配任何东西,所以它默认为零值,这就是为什么你总是得到 Thu Jan 1 00:00:00 1970 < / em>作为输出。

gbacon's answer和Perl一样光滑。

答案 6 :(得分:0)

GNU date / xargs解决方案:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps 

答案 7 :(得分:0)

这个简单的命令可以

 cat time.txt | while read line; do date -ud @$line; done > string.txt

答案 8 :(得分:0)

不要忘记在Perl

中可以使用localtime()代替gmtime()

所以,如果你在冬天不在格林威治,你可以使用localtime(),例如

Perl代码:

    my $unixtime = 1417014507;
    my $humantime = localtime($unixtime);
    print "\$humantime = $humantime \n";

输出:

    $humantime = Wed Nov 26 15:08:27 2014