Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Шел-скриптинг


Автор: Loki 9.7.2006, 16:06
Нужно предсатвить формат даты из вида 
CCYY-MM-DD hh:mm:ss.000000000
в вид
MMDDhhmmCCYY.ss

В перлах я не очень, но на *sh точно такое не реализовать.
DT=`ls -l -F --full-time date.sh | awk '{print $6 "" $7 "" $8}'`; echo $DT
в шеле даёт вывод
2006-07-0916:39:34.000000000+0400
мне это нужно перевести в 
date 070916392006.34
Код
#!/usr/bin/perl
use strict;
my $DT=`ls -l -F --full-time date.sh | awk '{print $6 "" $7 "" $8}'`;
open (STDIN, "$DT") or die "$!\n";
perl -ane '/^(.+)(\d{4})-(\d\d)-(\d\d)\s+(\d\d):(\d\d):(\d\d)(.+)/;
($pref, $CCYY, $MM, $DD, $hh, $mm, $ss, $suff) = ($1, $2, $3, $4, $5, $6, $7, $8);
DT=`ls -l -F --full-time date.sh | awk '{print $6 "" $7 "" $8}'`;
date "$MM$DD$hh$mm$CCYY.$ss$suff\n"'


Листинг ошибки:
Код

./test.sh
Unquoted string "perl" may clash with future reserved word at ./test.sh line 4.
String found where operator expected at ./test.sh line 6, near "print "$pref, $MM$DD$hh$mm$CCYY.$ss$suff\n"'"
  (Might be a runaway multi-line '' string starting on line 4)
        (Missing semicolon on previous line?)
syntax error at ./test.sh line 6, near "print "$pref, $MM$DD$hh$mm$CCYY.$ss$suff\n"'"
Execution of ./test.sh aborted due to compilation errors.

что не так?
__
заранее благодарен! 

Автор: sharq 10.7.2006, 09:54
Loki, 
Цитата(Loki @  9.7.2006,  17:06 Найти цитируемый пост)
что не так?

в Perl нет командв perl  smile 

Код

use strict;

my $date = '2006-07-09 16:39:34.000000000+0400';
(my $new = $date) =~ s/^ (\d{2}\d{2}) - (\d{2}) - (\d{2}) \  (\d{2}) : (\d{2}) : (\d{2}) \. .* $/$2$3$4$5$1.$6/x;
print $new;

__END__
CCYY-MM-DD hh:mm:ss.000000000
в вид
MMDDhhmmCCYY.ss


 smile  

Автор: Loki 11.7.2006, 07:53
спасибо, ситуация немного прояснилась, но всё же теперь кот в чём косяк...
При выполнении:
Код

./date.sh
date

А должно date дата последнего изменения файла, которая в переменной $DT, только приобразованная в другой формат...
Мой код:
Код

#!/usr/bin/perl
use strict;
my $DT=`ls -l -F --full-time /root/date.sh | awk '{print $6 "" $7 "" $8}'`;
#open (STDIN, "$DT") or die;
(my $new = $DT)=~ s/^ (\d{2}\d{2})-(\d{2})-(\d{2}) \ (\d{2}) : (\d{2}) : (\d{2}) \. .* $/$2$3$4$5$1.$6/x;
print "date $new";
  

Автор: sharq 11.7.2006, 11:28
Loki, 

Цитата(Loki @  11.7.2006,  08:53 Найти цитируемый пост)
./date.sh

скрипт должен называть date.pl  smile 

Цитата(Loki @  11.7.2006,  08:53 Найти цитируемый пост)
my $DT=`ls -l -F --full-time /root/date.sh | awk '{print $6 "" $7 "" $8}'`;

Возращает без пробела между датой и времени, а ты указывал формат с пробелом
Цитата(Loki @  9.7.2006,  17:06 Найти цитируемый пост)
CCYY-MM-DD hh:mm:ss.000000000

 smile 

Поэтому вот:
Код

#!/usr/bin/perl
use strict;
my $DT=`ls -l -F --full-time /root/date.sh | awk '{print $6 "" $7 "" $8}'`;
#open (STDIN, "$DT") or die;
(my $new = $DT)=~ s/^ (\d{2}\d{2})-(\d{2})-(\d{2}) (\d{2}) : (\d{2}) : (\d{2}) \. .* $/$2$3$4$5$1.$6/x;
print "date $new";


А я вообще бы это сделал так:
Код

ls -l -F --full-time ./mysql.pl | perl -ane 'print "$F[5]$F[6]$F[7]"' | ./date.pl


date.pl
Код

#!/usr/bin/perl
local $/;
for (<>) {
    print "old: $_\n";
    s/^ (\d{2}\d{2}) - (\d{2}) - (\d{2}) (\d{2}) : (\d{2}) : (\d{2}) \. .* $/$2$3$4$5$1.$6/x;
    print "new: $_\n";
}


 smile 

  

Автор: Loki 12.7.2006, 04:38
sharq
Спасибо!
Ещё еще несколько вопросов...
Как можно сделать на шел(bash) или на перл чтобы была проверка на наличие файла и его размера.
Т.е. нужно проверять размер файла и сравнивать с заданным значением? Если же что-то не так то выполнять определённые действия(но с этим проблемы не будет).

Как сделать так чтобы отсылались уведомления на e-mail о проделынных действиях и их завершении?

Как всё это сделать с слежением в реалтайме(типо при достижении определённого времяни запускать/останавливать), но при том чтобы это не съедало всё процессорное время?
__
заранее благодарен! 

Автор: sharq 12.7.2006, 13:06
Loki, 
Цитата(Loki @  12.7.2006,  05:38 Найти цитируемый пост)
Как можно сделать на шел(bash) или на перл чтобы была проверка на наличие файла и его размера.
Т.е. нужно проверять размер файла и сравнивать с заданным значением? Если же что-то не так то выполнять определённые действия(но с этим проблемы не будет).


Код

my $file = '/path/file.pl';
my $quote = 10;
if (-f $file && (my $length = -s $file) > $quote) {
  ...
} else {
  ...
}



Цитата(Loki @  12.7.2006,  05:38 Найти цитируемый пост)

Как сделать так чтобы отсылались уведомления на e-mail о проделынных действиях и их завершении?

Использовать sendmail, для чего можно использовать готовые модули, посмотри здесь.

Цитата(Loki @  12.7.2006,  05:38 Найти цитируемый пост)
Как всё это сделать с слежением в реалтайме(типо при достижении определённого времяни запускать/останавливать), но при том чтобы это не съедало всё процессорное время?

Можешь запускать скрипт по cron'у и следить за этим.

 smile 
 

Автор: Loki 12.7.2006, 14:31
Цитата

А я вообще бы это сделал так:
Код

ls -l -F --full-time ./mysql.pl | perl -ane 'print "$F[5]$F[6]$F[7]"' | ./date.pl


date.pl
Код

#!/usr/bin/perl
local $/;
for (<>) {
    print "old: $_\n";
    s/^ (\d{2}\d{2}) - (\d{2}) - (\d{2}) (\d{2}) : (\d{2}) : (\d{2}) \. .* $/$2$3$4$5$1.$6/x;
    print "new: $_\n";
}



# ls -l -F --full-time date.sh | perl -ane 'print "$F[5]$F[6]$F[7]"' | date.pl
-bash: date.pl: command not found
Цитата

Код

my $file = '/path/file.pl';
my $quote = 10;
if (-f $file && (my $length = -s $file) > $quote) {
  ...
} else {
  ...
}


Тут
$file - путь к файлу
$quote - что такое?
$length - размер файла?
Цитата

Использовать sendmail, для чего можно использовать готовые модули, посмотри здесь.
Можешь запускать скрипт по cron'у и следить за этим.

Нет, использовать что- либо не представляет быть возможным smile 
Как это решить более автономно?
 

Автор: Basteon 12.7.2006, 15:57
Уф, с датой разобрался=) 

Автор: DENNN 12.7.2006, 16:17
Цитата(Loki @  12.7.2006,  14:31 Найти цитируемый пост)
Цитата

Использовать sendmail, для чего можно использовать готовые модули, посмотри здесь.
Можешь запускать скрипт по cron'у и следить за этим.

Нет, использовать что- либо не представляет быть возможным smile 
Как это решить более автономно?
  

не надо привязываться к почтовику. Лучше попробывать использовать встроенную юниксовую команду mail
 

Автор: Loki 12.7.2006, 18:26
Вот что-то вроде того...
Код

H=`date "+%H"
while [ "0$H">01, "0$H"<07 ];do sleep 600 
...
done

но не рабоатет;-\
Цитата
не надо привязываться к почтовику. Лучше попробывать использовать встроенную юниксовую команду mail

 smile   

Автор: DENNN 12.7.2006, 18:42
пример с консоли:
Код

@www ~# mail [email protected]
Subject: test
helo everybody!
.
EOT
@www ~#

как лучше "подсунуть" все строки из скрипта я не скажу. Недавно по форумам пробегал анналогичный вопрос, но по использованию telnet из перла. Поищи на opennet.ru и sysadmins.ru
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)