1

Temat: Jak policzyć ilość wystąpień założonego warunku?

W kilkuset wiadomościach na dobę otrzymuję logi z crona.
Oczekuję, że w takim liście będzie 5 wystąpień stringu
HTTP request sent, awaiting response... 200 OK

Jeśli takie wyrażenie wystąpi w liście 5 razy - list powinien być oznaczony jako przeczytany.
Jeśli ilość wystąpień jest różna od 5 doszło na serwerze do błędu i list powinien być wyróżniony.

Czy potrafi ktoś znaleźć sposób jak powyższe zagadnienie zamknąć w regułce?
TheBat 4.2

2

Odp: Jak policzyć ilość wystąpień założonego warunku?

Należy użyć wyrażeń regularnych i trochę pobawić się z eksportem wiadomości do pliku tekstowego w celu jego późniejszej obróbki. Da się to zrobić, ale zacytuj dokładnie (jeśli możesz, usuwając wrażliwe dane) jak wygląda przykładowa wiadomość. Wtedy spróbuję szybko wymyślić konkretne rozwiązanie.

3

Odp: Jak policzyć ilość wystąpień założonego warunku?

Uwielbiam wyrażenia regularne w TheBat smile
Dobrze, że szef nie wie ile ten programik roboty za mnie odwala big_smile
Teraz niestety stanąłem przed ścianą i nic nie mogę wymyślić....
Maile o których piszę wyglądają tak:

--2010-12-08 20:10:01--  http://parser.serwer.pl/get.php?pid=1
Resolving parser.serwer.pl... IP.IP.IP.IP
Connecting to parser.serwer.pl|IP.IP.IP.IP|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to parser.serwer.pl:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `get.php?pid=1.15'

     0K                                                        3.87M=0s

2010-12-08 20:11:04 (3.87 MB/s) - `get.php?pid=1.15' saved [70]

--2010-12-08 20:11:04--  http://parser.serwer.pl/get.php?pid=2
Resolving parser.serwer.pl... IP.IP.IP.IP
Connecting to parser.serwer.pl|IP.IP.IP.IP|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to parser.serwer.pl:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `get.php?pid=2.19'

     0K                                                        6.20M=0s

2010-12-08 20:12:01 (6.20 MB/s) - `get.php?pid=2.19' saved [70]

--2010-12-08 20:12:01--  http://parser.serwer.pl/get.php?pid=3
Resolving parser.serwer.pl... IP.IP.IP.IP
Connecting to parser.serwer.pl|IP.IP.IP.IP|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to parser.serwer.pl:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `get.php?pid=3.19'

     0K                                                        6.83M=0s

2010-12-08 20:13:05 (6.83 MB/s) - `get.php?pid=3.19' saved [70]

--2010-12-08 20:13:05--  http://parser.serwer.pl/get.php?pid=4
Resolving parser.serwer.pl... IP.IP.IP.IP
Connecting to parser.serwer.pl|IP.IP.IP.IP|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to parser.serwer.pl:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `get.php?pid=4.14'

     0K                                                        5.84M=0s

2010-12-08 20:14:07 (5.84 MB/s) - `get.php?pid=4.14' saved [70]

--2010-12-08 20:14:07--  http://parser.serwer.pl/get.php?pid=5
Resolving parser.serwer.pl... IP.IP.IP.IP
Connecting to parser.serwer.pl|IP.IP.IP.IP|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to parser.serwer.pl:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `get.php?pid=5.15'

     0K                                                        5.47M=0s

2010-12-08 20:15:07 (5.47 MB/s) - `get.php?pid=5.15' saved [70]

4

Odp: Jak policzyć ilość wystąpień założonego warunku?

Sprawa jest prosta gdy w wiadomości szukany ciąg znaków występuje dokładnie 5 razy. Wtedy użyj filtru (nazwijmy go tutaj filtrem A), w którym jako warunek wpiszesz:

Treść pasuje do (?ism-U)(.*200\sOK){5}

Filtr powinien oznaczać taką wiadomość jako przeczytaną i usuwać wyróżnienie (np. znacznik flagi lub kolor). Jeśli w wiadomości występują w innym kontekście kody odpowiedzi serwera 200 OK, wówczas w warunku musisz podać pełny komunikat serwera, czyli zapisać to tak:

Treść pasuje do (?ism-U)(.*HTTP\srequest\ssent\,\sawaiting\sresponse\.\.\.\s200\sOK){5}

Sprawa się trochę komplikuje gdy szukane wyrażenie nie występuje  w wiadomości dokładnie 5 razy. Trzeba wówczas użyć innego warunku, zawężającego nieco obszar poszukiwań np. tylko do wiadomości, których nadawca ma konkretny adres e-mail. Taki filtr (nazwijmy go filtrem B) powinien zatem sprawdzać nadawcę i wyróżniać wiadomość (np. ustawiając znacznik flagi lub kolor).

Teraz pozostaje ustawienie filtrów w odpowiedniej kolejności: jako pierwszy ustaw filtr B, a pod nim filtr A. Działa to tak, że filtr B oznakowuje wszystkie wiadomości od danego nadawcy, a filtr A usuwa to oznakowanie tam gdzie jest pięć powtórzeń ciągu i oznacza takie wiadomości jako przeczytane. Jak widać, jest to prostsze niż początkowo sądziłem.

5

Odp: Jak policzyć ilość wystąpień założonego warunku?

Zygmucie bardzo Ci dziękuję że nie śpisz a ludziom pomagasz smile
Będę o Tobie myślał pijąc kolejną kawę, na którą dzięki powyższej poradzie znajdę czas smile

6

Odp: Jak policzyć ilość wystąpień założonego warunku?

Może i ja wypiję jeszcze kawę? :-)
Wracając do wyrażeń regularnych w The Bat! i innych udogodnień: ja nadal po ponad 10-letnim używaniu programu nie mogę wyjść z podziwu jak sprawnie one działają. Ostatnio musiałem zbudować wykres, pokazujący zmiany pewnej wielkości fizycznej w ciągu roku. Dane były zapisane na serwerze WWW w postaci tabeli zawierającej odczyty sześciu parametrów dokonywane co godzinę i ich sumy dobowe. Jedna z tych sum była mi potrzebna i The Bat! wykonał to zadanie w kilkanaście minut. Odbyło się to w taki sposób, że The Bat! uruchamiał program "wget" pobierający na dysk cała stronę WWW i następnie za pomocą wyrażeń regularnych wyłuskiwał z tego potrzebną wartość, a potem zapisywał ją do pliku CSV - i tak 365 razy. Podejrzewam, że ręczne pobieranie tych danych zajęłoby mi co najmniej kilka godzin. Jak zatem widać - po raz kolejny okazało się, że The Bat! może (prawie) wszystko.

7

Odp: Jak policzyć ilość wystąpień założonego warunku?

Rzeczywiście ekstremalny przypadek. Można by zrobić taki konkurs - do czego najdziwniejszego użyłem Nietoperka smile

pozdrawiam i jeszcze raz dzięki

8

Odp: Jak policzyć ilość wystąpień założonego warunku?

Aby uzyskać pełnię szczęścia, należy nieco zmodyfikować filtry i zwiększyć ich liczbę. Wynika to z faktu, że filtr A wykrywa 5 i więcej wystąpień ciągu (a chciałeś aby szukał dokładnie pięciu). Sprawdziłem jak to działa i proponuję trzy filtry z następującymi kryteriami:

Filtr A:
Treść pasuje do (?ism-U)(.*200\sOK){5}
Filtr A usuwa wyróżnienie i oznacza wiadomości jako przeczytane

Filtr B:
Treść pasuje do (?ism-U)(.*200\sOK){6,}
Filtr B wyróżnia wiadomość (np. ustawiając znacznik flagi lub kolor)


Filtr C:
Treść pasuje do (?ism-U)(.*200\sOK){0,4}
Filtr C wyróżnia wiadomość (np. ustawiając znacznik flagi lub kolor)

W każdym filtrze jest włączona opcja kontynuacji filtrowania. Filtry należy umieścić na początku listy filtrów poczty przychodzącej w następującej kolejności: C, A, B.

W każdym filtrze warto także dodać warunek sprawdzania adresu nadawcy, połączony  operatorem AND z jednym z wyżej wymienionych warunków. Ograniczymy w ten sposób liczbę przetwarzanych wiadomości.

9

Odp: Jak policzyć ilość wystąpień założonego warunku?

Rozumiem

10

Odp: Jak policzyć ilość wystąpień założonego warunku?

Można uprościć filtry i używane w nich warunki jeżeli zainstaluje się wtyczkę XMP rozszerzającą makra (http://thebat.pl/download/index.php?ite … p;catid=16). Wtedy wystarczy jeden filtr nadrzędny i dwa podrzędne umieszczone każdy na innym poziomie hierarchii (A->B->C). Dzięki wtyczce XMP pozbywamy się kłopotliwych wyrażeń regularnych, występujących w poprzednio proponowanych filtrach.

Filtr A (nadrzędny)
Sprawdza ogólny warunek (np. czy wiadomość pochodzi od serwera) i ustawia parametr, nazwijmy go OK, tak aby był równy liczbie wystąpień łańcucha "HTTP request sent, awaiting response... 200 OK" w treści wiadomości. Do tego celu jest użyte makro z wtyczki XMP, wykonujące zliczanie: %XMP_StrCount("%OText","HTTP request sent, awaiting response... 200 OK",1) - to należy wpisać jako wartość parametru OK.

Filtr B (podrzędny, pod A)
Warunek: dodatkowy parametr OK nie jest równy 5.
Operacja: wyróżnienie wiadomości w żądany sposób (flaga, kolor).

Filtr C (podrzędny, pod B)
Warunek: dodatkowy parametr OK jest równy 5
Operacje: oznaczenie wiadomości jako przeczytanej, usunięcie wyróżnienia (flagi, koloru)