Я обробляю файл, наповнений тимчасовими рядками 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 для відповіді № 1$ perl -lne "друкувати скалярний gmtime $ _" test.txt Ср. 19 липня 18:56:41 2006 Пт 21 липня 02:23:06 2006 Пт 21 липня 10:12:09 2006 Пт 21 липня 15:05:10 2006 Сб 22 липня 21:27:42 2006 Нд 23 липня 07:36:51 2006
3 для відповіді № 2
Оскільки $line
знаходиться в одинарних лапках, це не обробляється bash, і так $line
трактується як (невизначена) змінна Perl, а не баш-змінна.
Ви не потребуєте а while read
петля-баш; Perl може робити циклічне використання, використовуючи його -n
варіант
perl -nE "say scalar(gmtime($_))" test.txt
(використовуючи -E для включення say
, яка автоматично додає новий рядок)
1 для відповіді № 3
Не використовуйте cat
.
#! /bin/bash
file="test.txt"
while read line
do
date -d @$line
done < "$file"
1 для відповіді № 4
Це "не перерив лінії, це" $line
всередині сценарію Perl є різною змінною, ніж $line
в сценарії bash. Ви можете спробувати:
perl -e "print scalar(gmtime($line)),qq/\n/"
Зверніть увагу на подвійні лапки, які дозволяють bash робити змінну інтерполяцію.
0 для відповіді № 5
Не потрібно Perl:
awk "{ print strftime("%c", $0) }" somefile.txt
0 для відповіді № 6
Проблема полягає в тому, що ви нічого не призначили $line
змінна, тому вона за замовчуванням до нульового значення, саме тому ви завжди отримуєте Чт 1 січня 00:00:00 1970 як вихід.
відповідь gbacon приблизно так само гладко, як це стає в Perl.
0 для відповіді № 7
Рішення щодо дати / xargs GNU:
xargs -i date -d "1970-01-01 00:00:00 {} seconds" </tmp/timestamps
0 для відповіді № 8
Ця проста команда зробить
cat time.txt | while read line; do date -ud @$line; done > string.txt
0 для відповіді № 9
Не забуваючи, що в Perl замість gmtime () можна використовувати замість gmtime ()
Отже, якщо ви "не перебуваєте в Грінвічі взимку, ви можете використовувати localtime (), наприклад,
Код Perl:
my $unixtime = 1417014507;
my $humantime = localtime($unixtime);
print "$humantime = $humantime n";
вихід:
$humantime = Wed Nov 26 15:08:27 2014