Как я могу преобразовать файл, полный строк времени Unix, в удобочитаемые даты? - PullRequest
4 голосов
/ 17 мая 2010

Я обрабатываю файл, полный строк времени 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

Это не работает. Я получаю вывод Чт 1 января 00:00:00 1970 для каждой строки. Я думаю, что разрывы строк подобраны, и поэтому он не работает. Есть идеи? Я использую Mac OSX, это что-то меняет.

Ответы [ 9 ]

9 голосов
/ 17 мая 2010
$ 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
3 голосов
/ 17 мая 2010

Поскольку $line заключено в одинарные кавычки, оно не обрабатывается bash, поэтому $line рассматривается как (неопределенная) переменная Perl, а не как bash.

Вам не нужен while read цикл bash; Perl может выполнить цикл сам, используя опцию -n.

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

(используя -E для включения say, что автоматически добавляет новую строку)

1 голос
/ 18 мая 2010

Это не разрывы строк, это то, что $line внутри скрипта Perl - это другая переменная, чем $line в скрипте bash. Вы можете попробовать:

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

Обратите внимание на двойные кавычки, которые позволяют bash выполнять переменную интерполяцию.

1 голос
/ 17 мая 2010

Не используйте cat.

#! /bin/bash
file="test.txt"
while read line
do
    date -d @$line
done < "$file"
0 голосов
/ 26 ноября 2014

Не забывая, что localtime () можно использовать вместо gmtime () в Perl

Итак, если вы не в Гринвиче зимой, вы можете использовать localtime (), например,

Код Perl:

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

выход:

    $humantime = Wed Nov 26 15:08:27 2014 
0 голосов
/ 19 августа 2010

Эта простая команда сделает

 cat time.txt | while read line; do date -ud @$line; done > string.txt
0 голосов
/ 17 мая 2010

GNU date / xargs решение:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps 
0 голосов
/ 17 мая 2010

Проблема в том, что вы ничего не присвоили переменной $line, поэтому по умолчанию используется нулевое значение, поэтому вы всегда получаете Чт 1 января 00:00:00 1970 в качестве вывода.

ответ gbacon примерно такой же плавный, как и в Perl.

0 голосов
/ 17 мая 2010

Нет необходимости в Perl:

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