Простенький скрипт:#!/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 - (т.е. вместо запятых чтобы были точки)?
>[оверквотинг удален]
>
>Результат выполнения:
>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})$//;
>$avg =~ s/^.*:\s(\d+\.\d{2}),?\s(\d+\.\d{2}),?\s(\d+\.\d{2})$//;не работает, выдаётся просто:
1min: 5min: 10min:
>не работает, выдаётся просто:
>1min: 5min: 10min:$avg =~ s/^.*:\s(\d+\,\d{2}).?\s(\d+\,\d{2}).?\s(\d+\,\d{2})$//;
а так? %)
$avg =~ s/,/\./g;
$avg =~ s/^.*:\s([\d\.]+),\s([\d\.]+),\s([\d\.]+)$//;кстати в линуксе лучше читать файлик /proc/loadavg
>Как сделать чтобы скрипт выдавал так:
>1min:0.14 5min:0.13 10min:0.10 - (т.е. вместо запятых чтобы были точки)?попробуй вместо \, поставить \. или .
Не гарантирую но на 80% уверен :)
пришёл к варианту:$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откуда берётся точка после первых значений я ненаю...
Проблемма разрешилась следующим образом, мой 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: осталось теперь понять откуда различия растут, но это уже совсем другая история.
Всем пасип за ответы.
У как все запущено. А что будет если локаль другая и разделитель точка, а не запятая? А если 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, но я не уверен что они для всех версий одинаковы.
>У как все запущено. А что будет если локаль другая и разделитель
>точка, а не запятая? А если 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, сколько перловые регексы. Рекомендую к прочтению man perlretut для основ и man perlre + man perlop в качестве справочника. Если же есть время и хочется овладеть регексами в совершенстве, то тогда O'Reilly "Mastering regular expressions"