URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7087
[ Назад ]

Исходное сообщение
"подскажите кто знает perl"

Отправлено LKharlamov , 06-Янв-08 12:01 
Простенький скрипт:

#!/usr/bin/perl

#get load avg for 1;5;10 min
open(PROCESS, "uptime |");
$avg = <PROCESS>;
close(PROCESS);

$avg =~ s/^.*:\s(\d+\,\d{2}),?\s(\d+\,\d{2}),?\s(\d+\,\d{2})$//;

print "1min:$1 5min:$2 10min:$3";

Результат выполнения:
1min:0,14 5min:0,13 10min:0,10

результат отработки команды uptime в системе:
13:59  up 1 day,  2:11, 1 user, load averages: 0,14 0,13 0,10

Как сделать чтобы скрипт выдавал так:
1min:0.14 5min:0.13 10min:0.10 - (т.е. вместо запятых чтобы были точки)?


Содержание

Сообщения в этом обсуждении
"подскажите кто знает perl"
Отправлено Goudini , 06-Янв-08 21:45 
>[оверквотинг удален]
>
>Результат выполнения:
>1min:0,14 5min:0,13 10min:0,10
>
>результат отработки команды uptime в системе:
>13:59  up 1 day,  2:11, 1 user, load averages: 0,14
>0,13 0,10
>
>Как сделать чтобы скрипт выдавал так:
>1min:0.14 5min:0.13 10min:0.10 - (т.е. вместо запятых чтобы были точки)?

$avg =~ s/^.*:\s(\d+\.\d{2}),?\s(\d+\.\d{2}),?\s(\d+\.\d{2})$//;


"подскажите кто знает perl"
Отправлено LKharlamov , 06-Янв-08 22:24 
>$avg =~ s/^.*:\s(\d+\.\d{2}),?\s(\d+\.\d{2}),?\s(\d+\.\d{2})$//;

не работает, выдаётся просто:
1min: 5min: 10min:


"подскажите кто знает perl"
Отправлено Goudini , 06-Янв-08 23:14 
>не работает, выдаётся просто:
>1min: 5min: 10min:

$avg =~ s/^.*:\s(\d+\,\d{2}).?\s(\d+\,\d{2}).?\s(\d+\,\d{2})$//;
а так? %)


"подскажите кто знает perl"
Отправлено FarID , 07-Янв-08 10:53 
$avg =~ s/,/\./g;
$avg =~ s/^.*:\s([\d\.]+),\s([\d\.]+),\s([\d\.]+)$//;

кстати в линуксе лучше читать файлик /proc/loadavg


"подскажите кто знает perl"
Отправлено Raptor , 07-Янв-08 15:07 

>Как сделать чтобы скрипт выдавал так:
>1min:0.14 5min:0.13 10min:0.10 - (т.е. вместо запятых чтобы были точки)?

попробуй вместо \, поставить \. или .

Не гарантирую но на 80% уверен :)



"подскажите кто знает perl"
Отправлено LKharlamov , 07-Янв-08 20:29 
пришёл к варианту:

$avg =~ s/,/\./g;
$avg =~ s/^.*:\s([\d\.]+)?\s([\d\.]+)?\s([\d\.]+)$//;

при выполнении скрипта из консоли результат выдаётся нормальный:
1min:0.05 5min:0.07 10min:0.04

а при выполнении скприпта из кактуса, в логе пишется:
perl /usr/local/share/cacti/scripts/loadavg_multi.pl, output: 1min:0.01. 5min:0.05. 10min:0.04

откуда берётся точка после первых значений я ненаю...


"подскажите кто знает perl"
Отправлено LKharlamov , 07-Янв-08 21:20 
Проблемма разрешилась следующим образом, мой uptime выдаёт:
23:15  up 2 days, 11:26, 1 user, load averages: 0,06 0,02 0,00

Взял с другой машины uptime (тоже freebsd) выдаёт:
11:16PM  up 2 days, 11:28, 1 user, load averages: 0.26, 0.06, 0.02

как раз под такой вывод и заточен изначальный скприпт.

ps: осталось теперь понять откуда различия растут, но это уже совсем другая история.

Всем пасип за ответы.


"подскажите кто знает perl"
Отправлено angra , 07-Янв-08 21:42 
У как все запущено. А что будет если локаль другая и разделитель точка, а не запятая? А если  uptime не в $PATH? Зачем s// вместо //, зачем экранируем запятые, зачем экранируем в замене и в []?
Простейший работающий вариант
perl -e '$_=`/usr/bin/uptime`;/average.*(\d+)[,.](\d+).*(\d+)[,.](\d+).*(\d+)[,.](\d+)/; print "1 min:$1.$2 5min:$3.$4 15min:$5.$6\n"'
Для большей строгости конечно можно было бы вместо .* использовать разделители выдаваемые uptime, но я не уверен что они для всех версий одинаковы.

"подскажите кто знает perl"
Отправлено LKharlamov , 08-Янв-08 12:21 
>У как все запущено. А что будет если локаль другая и разделитель
>точка, а не запятая? А если  uptime не в $PATH?
>Зачем s// вместо //, зачем экранируем запятые, зачем экранируем в замене
>и в []?
>Простейший работающий вариант
>perl -e '$_=`/usr/bin/uptime`;/average.*(\d+)[,.](\d+).*(\d+)[,.](\d+).*(\d+)[,.](\d+)/; print "1 min:$1.$2 5min:$3.$4 15min:$5.$6\n"'
>Для большей строгости конечно можно было бы вместо .* использовать разделители выдаваемые
>uptime, но я не уверен что они для всех версий одинаковы.
>

ненаю пока perl, а вам angra - РЕСПЕКТ!


"подскажите кто знает perl"
Отправлено angra , 09-Янв-08 02:22 
Это не столько сам Perl, сколько перловые регексы. Рекомендую к прочтению man perlretut для основ и man perlre + man perlop в качестве справочника. Если же есть время и хочется овладеть регексами в совершенстве, то тогда O'Reilly "Mastering regular expressions"