LINUX.ORG.RU

Perl, обработка даты

 , ,


0

1

Всем привет. Выцепляю из лога дату, с помощью баш. В итоге получается массив такого вида

12/01/2015 08:06:12 12/01/2015 08:06:13 12/01/2015 08:06:14 12/01/2015 08:06:14 12/01/2015 08:21:06 12/01/2015 08:21:07 12/01/2015 08:21:07 12/01/2015 08:21:08 12/01/2015 08:21:09 12/01/2015 08:21:10 12/01/2015 08:21:11 12/01/2015 08:21:11

Пытаюсь преобразовать данную дату в юникс время

LASTACTIONDATETIME=`echo "$LASTACTIONLINE" | awk -F. '{print $1}'`
		for TM in $LASTACTIONDATETIME ; do
		NEWTIME=`perl -e "use Time::Local; timelocal($TM[5]-1900,$TM[4]-1,$TM[3],$TM[2],$TM[1],$TM[0]);"`

в итоге скрипт дает ошибку

Execution of -e aborted due to compilation errors. syntax error at -e line 1, near «2015[» Execution of -e aborted due to compilation errors. syntax error at -e line 1, near «01:» Illegal octal digit '9' at -e line 1, at end of line Illegal octal digit '9' at -e line 1, at end of line

Пыталась экранировать переменную

NEWTIME=`perl -e "use Time::Local; timelocal(\$TM[5]-1900,\$TM[4]-1,\$TM[3],\$TM[2],\$TM[1],\$TM[0]);"`

Как еще можно обойти эту проблему?

я не понял что нужно сделать. тут тег bash стоит, так что

date --date="12/01/2015 08:06:12" +%s

bl ★★★
()
Ответ на: комментарий от bl

не прокатит, Суровая солярка этого не понимает :) Пробовала без perl сделать, посылает далеко и надолго.

Zlobnaya
() автор топика

две ошибки

1. чтобы из perl обратиться к environment variable, нужно использовать конструкцию вида $ENV{TM}. Это самый простой вариант. при этом сам перловый скрипт можно взять в одинарные кавычки, чтобы не пришлось ничего экранировать. Либо можно выполнять подстановку на уровне bash, но подумай о том, как это будут выглядеть с точки зрения perl. Объявляй переменные, добавляй строки в кавычки

2. $TM[5] - ты рассчитываешь на bash или на perl? в первом случае тебе нужно явно разбить стоку на элементы с помощью средств bash. Во втором тебе нужно .... явно разбить строку на элементы с помощью средств perl %) ( например, split )

router ★★★★★
()

Если все равно подключаешь перл, может проще уже весь скрипт на нем переписать, чем костыли к велосипеду синей изолентой приматывать?

anonymous
()
Ответ на: комментарий от router

выцепляю дату и время из лога с помощью bash, и с помощью perl пытаюсь перевести полученное время в unix формат. Все эти велосипеды, чтобы найти разницу во времени. К сожалению, Solaris, обычные bash способы обработки времени не понимает.

Zlobnaya
() автор топика
Ответ на: комментарий от Zlobnaya

Эх, а ведь есть еще и тикль, в котором можно так:

% TM='12/01/2015 08:06:12'
% echo "puts [clock scan {$TM} -format {%m/%d/%Y %H:%M:%S} -gmt 0]" | tclsh
1448946372

TeopeTuK ★★★★
()
Ответ на: комментарий от anonymous

Покажете класс, работающий на Солярке

Zlobnaya
() автор топика

Модуль Date::Parse есть? Если да, то можно ему скармливать дату:

echo "12/01/2015 08:06:12" | perl -wE 'use Date::Parse;my$l=shift@ARGV;my$z=str2time(<>);say $z'

Если нет, то

echo "12/01/2015 08:06:12" | perl -nwE '@_=split m#[ :/]#,$_;use Time::Local;say timelocal($_[5],$_[4],$_[3],$_[1],$_[0]-1,$_[2]-1900)'

disarmer ★★★
()
Ответ на: комментарий от disarmer

Супер, получилось. Сделала так

NEWTIME=`echo "$TM" | perl -nwe '@_=split m#[ :/]#,$_;use Time::Local; print timelocal($_[5],$_[4],$_[3],$_[1],$_[0]-1,$_[2]-1900);'`

все нормально вывелось

Zlobnaya
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.