Страница 3 из 4

Re: скриптинг, работа со строкой (файлами) ...?

Добавлено: 10 сен 2014, 15:27
-user-
никто мне не отвечает на мои глупые вопросы... решил отвлечься от очередей и приоритетов... родилось это :-) :
 тест

Код: Выделить всё

{:put [:time {[:local match] [:local iter] [set match 0] [set iter 200] [:local ar1 [:toarray ""]; for v1 from=1 to=$iter do={set ar1 ($ar1, $v1)}] [:local ar2 [:toarray ""]; for v2 from=$iter to=($iter+$iter) do={set ar2 ($ar2, $v2)}] [:foreach data1 in=$ar1 do={:foreach data2 in=$ar2 do={:if (data1=data2) do={set match ($match+1)}}}]}]}
Скрипт показывает время за которое сравнивается два массива. Количество элементов в массиве задается тут - [set iter 200] Больше цифра - дольше перебирает - более точен результат сравнения двух МТ_роутеров.
Интересно, будет ли загружено более одного ядра в многоядерных МТ_роутерах (имеется ввиду полноценно, а не просто перекидывание задачи по ядрам).


результаты на Микротиковских Демках:
 
    массивы из 400:
    1) 680 MHz (http://demo2.mt.lv/) RB433UAH
    00:00:36.840563
    00:00:32.854128
    00:00:34.579667
    00:00:36.305826

    массивы из 200:
    1) 680 MHz (http://demo2.mt.lv/) RB433UAH
    00:00:07.295267
    00:00:07.012183
    00:00:07.679998

    2) 300 MHz (http://demo.mt.lv/) RB433
    00:00:27.626822
    00:00:25.724782
    00:00:26.391050

Пока не понял почему увеличение частоты проца в ~два раза. дает ускорение сравнения в ~4 раза, наверное элементарное объяснение, но что-то я туплю.

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 10 сен 2014, 16:40
podarok66
Ваша манера писать скрипты меня дезориентирует :)-(:
Как бы все в одну строку - это просто жесть. Насколько проще в плане восприятия такой вид:

Код: Выделить всё

{
:put [:time {
:local match;
:local iter;
:set match 0;
:set iter 200;
:local ar1;
:toarray "";
:for v1 from=1 to=$iter do={
:set ar1 ($ar1, $v1)
}
:local ar2;
:toarray "";
:for v2 from=$iter to=($iter+$iter) do={
:set ar2 ($ar2, $v2)
}
:foreach data1 in=$ar1 do={
:foreach data2 in=$ar2 do={
:if (data1=data2) do={
:set match ($match+1)
}
}
}
}]
}

И, простите, зачем Вам такое количество квадратных скобок? И почему перед командами Вы не ставите двоеточие?
Хотите, я Вам файл синтаксиса скину для Notepad++? Не полный, но хоть как-то и что-то раскрашивает... Всё более наглядно можно видеть...

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 10 сен 2014, 17:27
-user-
podarok66 писал(а):Как бы все в одну строку - это просто жесть.
есть программа (TypeText) которая набивает только одну строку в месте нахождения курсора в другом окне... эту программу приходиться использовать чтобы не набивать в ручную в терминале в http://demo2.mt.lv/ так как копипастинг в этом терминале не работает :-):

podarok66 писал(а):Насколько проще в плане восприятия такой вид:
согласен, именно так я сначала и делаю в текстовике, а потом собираю в одну строку, чтобы затесить на ДемоМикротик :ne_vi_del:

podarok66 писал(а):И, простите, зачем Вам такое количество квадратных скобок?
потому что их проще ставить чем пару - двоеточие+точка с запятой

podarok66 писал(а):И почему перед командами Вы не ставите двоеточие?

потому что терминалМТ не ругается на скрипт без этих знаков (при использовании квадратных скобок), а дурацкое правило в голове: получить тот же результат при меньших трудозатратах мешает ставить их самому.


Сори всем, кому докучал :mi_ga_et: больше не буду. Скрипт выложил просто чтобы запустил кто-нибудь как-есть и показал просто результат на выходе.
Удачи.

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 10 сен 2014, 17:35
podarok66
-user- писал(а):Сори всем, кому докучал больше не буду. Скрипт выложил просто чтобы запустил кто-нибудь как-есть и показал просто результат на выходе.
Удачи.

Как это не будете? Очень даже будете. Не надо пропадать, Вы очень даже ко двору здесь :hi_hi_hi: С Вами не скучно и интересно.

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 10 сен 2014, 17:38
podarok66
Кстати, у меня результат крутится около 7 секунд. Это RB951Ui-2HnD на частоте 500 и у RB951-2n около 8 секунд на частоте 400

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 03 окт 2014, 22:11
podarok66
Продолжаю эту интереснейшую тему, вернее подниму ее в связи с поиском совета.
Прошу не пинать, желания у меня иногда странные и к действительности отношения имеют мало. Короче, в наши железки постоянно ломятся, чаще всего с адресов, закрепленных за родным нашим, не побоюсь этого слова, Китаем. У меня есть скрипт, который заносит очень настойчивых в черный список на несколько дней, но потом все начинается сначала. И вот я подумал, а зачем мне вообще эти китайские адреса в диапазоне доступа на роутер. Ну запрет на цепочку input для адрес-листа написать не составляет труда никому, а вот занести большинство этих адресов в список, это уже интереснее. Но их там... почти 5 тысяч http://www.ipdeny.com/ipblocks/data/countries/cn.zone Вот я и подумал, а как бы автоматизировать сей процесс. Наваял наскоро несколько строк:

Код: Выделить всё

{

:local con [/file get [/file find name=list3.txt] contents];

:local conlen [:len $con];

:local linelen1 0;
:local linelen2 "";
:local linelen3 0;

:do {
:set linelen1 [:find $con "\r\n" $linelen3];
:set linelen2 [:pick $con $linelen3 $linelen1];
:set linelen3 ($linelen1 + 2);

:if ($linelen2 != "") do={

/ip firewall address-list add address=$linelen2 list="ChinaIP";

}
} while ($linelen1 < $conlen)
}

Больше 249 строк не обрабатывает, зараза, но я так подозреваю, что это пресловутое ограничение на файл не более 4 кб размером. Это фиг бы с ним, я и по 200 строк за раз бы обрабатывал, мне хватит, но есть несколько моментов, которые сегодня мне не дались и мне активно не нравяться.
* раз файлов со списками будет несколько, то хотелось бы прикрутить строчку, которая бы искала в подобных именах ( list1.txt, list2.txt, list3.txt...) те, которые еще не обработаны и запускала в обработку.
* там у меня ищутся знаки перевода каретки и начала новой строки "\r\n" . Так вот если в последней строке этих знаков нет, то последний адрес не заносит в списки. Как бы мне и с этим разобраться.

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 04 окт 2014, 08:37
vqd
Почитай про регулярные выражения.
Судя по документации микрот умеет но сам не разбирался с ними

“~” binary operator that matches value against POSIX extended regular expression Print all routes which gateway ends with 202
/ip route print where gateway~"^[0-9 \\.]*202"

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 04 окт 2014, 11:56
podarok66
Ну в общем, не так страшен оказался черт, каким выглядел поначалу.
Значит описываю всё по порядку. Имеет список адресов http://www.ipdeny.com/ipblocks/data/countries/cn.zone предположительно из китайской зоны. Это 4837 диапазонов (!) адресов. Хочется занести их в один список, чтобы проводить с ними различные манипуляции, в том числе и запретительного характера. Если забивать адреса руками, работа окажется просто невероятно долгой, если не невозможной вообще. Не мудрствуя лукаво, копирую все адреса с приведенной страницы в созданный мной текстовый файл list.txt , размещенный в отдельной папке (ну для удобства, чтобы не собирать потом все новый файлы по общей папке), в эту же папку помещаю bat-файл (взято отсюда) следующего содержания:

Код: Выделить всё

@echo off
set $n=200

for /f "tokens=1* delims=[]" %%i in ('find /v /n "" ^<list.txt') do set "$j=%%j"& call :sub %%i
exit
:sub
set /a $m=(%~1-1)/%$n%+1
set $m=0%$m%
set $m=%$m:~-2%

if not "%$i%"=="%$m%" type nul >list%$m%.txt
>>list%$m%.txt echo.%$j%
set $i=%$m%& exit /b

Запускаю это батник и у меня в этой папке создаются больше двух десятков файлов по 200 строк с названиями вида list01.txt, list02.txt, list03.txt и т. д. Эти файлы я скидываю на Микротик, на нем открываю терминал и там запускаю скрипт:

Код: Выделить всё

{
:local findfile [/file find name~"list*"];
:foreach i in=$findfile do={
:local con [/file get $i contents];

:local conlen [:len $con];

:local linelen1 0;
:local linelen2 "";
:local linelen3 0;

:do {
:set linelen1 [:find $con "\r\n" $linelen3];
:set linelen2 [:pick $con $linelen3 $linelen1];
:set linelen3 ($linelen1 + 2);

:if ($linelen2 != "") do={

/ip firewall address-list add address=$linelen2 list="ChinaIP";

}
} while ($linelen1 < $conlen);
/file remove $i;
}
}

Отработка идет секунд 10, всё-таки объем нешуточный. В итоге у нас создается адрес-лист ChinaIP с 4837 записями. Ну а уж с ним можно делать всё, что душа пожелает. Обработанные файлы будут удалены.
Регулярки меня пугают, если честно. Нет ни малейшего желания с ними разбираться, не мой это уровень. Я в них плавать буду долго и безрезультатно. А если результаты и будут, то мне их просто применять негде. Одним словом результат не будет стоить приложенных усилий.

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 17 сен 2023, 13:51
gregy
Скажите пожалуйста а как можно получить значение между двумя знаками. В частности нужно получить последний октет ip адреса.
192.168.1.1/24 или может быть 10.16.1.121/24. как получить то что находится между последней "." и "/" ?

Re: скриптинг (общее, вопросы 'обо' всем)

Добавлено: 18 сен 2023, 21:47
podarok66
gregy писал(а): 17 сен 2023, 13:51 Скажите пожалуйста а как можно получить значение между двумя знаками. В частности нужно получить последний октет ip адреса.
192.168.1.1/24 или может быть 10.16.1.121/24. как получить то что находится между последней "." и "/" ?
Говорим спасибо Illinory, который любезно сочинил скрипт под вашу хотелку

Код: Выделить всё

:global ipaddress 10.1.101.99/24;
:global j 0;
:for i from=( [:len $ipaddress] - 1) to=0 do={ 
  :if ( [:pick $ipaddress $i] = "/") do={ 
    :set j $i;
    :while ([:pick $ipaddress $j] != ".") do={
      :set j ( $j - 1 );
    };
    :put [:pick $ipaddress ($j+1) $i];
  } ;
};