Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam,
problem dotyczy pliku tekstowego o poniższej budowie
miejscowość
rodzaj_alarmu czas_wygenerowania czas_trwania tresc_alarmu
poniżej przykład:
KATOWICE
emergency 22:15:00 00:11:00 ping
Interesują mnie tylko alarmy o określonej treści np "ping" gdzie czas trwania jest większy od 1 minuty. W wyniku program powinien pokazać:
KATOWICE
emergency 22:15:00 00:11:00 ping.
Czyli najpierw sprawdza wartość "czas_trwania" i "tresc_alarmu", jeśli spełnia warunki to wyświetla miejscowość, czas i treść.
Zadanie w sam raz dla sed i awk ale nie jestem pewien jak wymusić sprawdzanie określonych wartości a potem cofnięcie się o n linijek wyżej tak żeby można było określić miejscowość.
Offline
Więc tak:
cofanie się w pliku odpada, ponieważ i tak nie wiesz o ile wierszy musisz się cofnąć. Chyba że masz jakiś pewny sposób na określenie, w którym momencie zaczynają się wiersze dla nowej miejscowości.
Jeżeli masz na to sposób, to czytaj plik wiersz po wierszu i kiedy natkniesz się na nową miejscowość, umieszczaj jej nazwę w jakiejś zmiennej. Potem czytasz sobie dalej aż natkniesz się na interesujący Cię warunek (trzecie pole ma większą niż określona wartość). Wtedy wypisujesz nazwę miejscowości ze zmiennej oraz wiersz spełniający warunek.
Całość więc sprowadza się do określenia pewnego sposobu na określenie, że dany wiersz zawiera nazwę miejscowości. Sądząc po Twoim przykładzie, być może chodzi o wszystkie wiersze złożone wersalikami. A może wszystkie wiersze które mają jedną lub mniej spacji (nie znam miejscowości w Polsce, której nazwa złożona by była z trzech wyrazów)?
A jeżeli masz kontrolę nad oprogramowaniem, które produkuje plik wejściowy, to zmień je tak, aby zamiast pseudo-ini produkowało zwykły log (nazwa miejscowości w każdym wierszu). Wtedy będziesz miał problem z głowy.
Offline
PERL
ewentualnie wytnij co drugi [i]newline[/i] podstawiając w jego miejsce coś co będzie rozdzielać [miejscowość] od [sygnatura alarmu].
Pokaż przykład dłuższego pliku, bo nie rozumię skąd jest "n linijek" skoro w zawartym przykładzie nazwa miejscowości jest nad datagramem.
Offline
Poniżej przykład pliku tekstowego, niestety nie mam wpływu na jego format. Czcionką pogrubioną zaznaczyłem wiersze które powinny znaleźć się w wyniku.
[b];WWA - Zachodni .234;;;;;[/b]
;192.168.0.234;;;;;
;;;;;;
;Severity;Generated on ;Cleared on ;Outage duration;Alarm Description;
;;;;;;
;critical;2012-09-16 23:08:39;"2012-09-16
23:09:29";00 00:00:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 19:23:39;"2012-09-16
[b]19:27:30";00 00:03:51;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 16:30:39;"2012-09-16
16:33:31";00 00:02:52;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 16:22:39;"2012-09-16
16:24:30";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;[/b]
;critical;2012-09-16 09:07:39;"2012-09-16
09:08:35";00 00:00:56;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 09:03:39;"2012-09-16
09:04:33";00 00:00:54;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 08:59:39;"2012-09-16
09:00:35";00 00:00:55;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 08:55:39;"2012-09-16
[b]08:57:37";00 00:01:58;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
[/b];critical;2012-09-16 05:44:39;"2012-09-16
05:45:30";00 00:00:51;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 02:25:39;"2012-09-16
[b]02:27:29";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 00:39:39;"2012-09-16
00:42:29";00 00:02:51;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
[/b];critical;2012-09-16 23:08:32;"2012-09-16
[b];TOR - PEC Aleks .222;;;;;[/b]
;192.168.0.222;;;;;
;;;;;;
;Severity;Generated on ;Cleared on ;Outage duration;Alarm Description;
;;;;;;
;critical;2012-09-16 03:58:33;"2012-09-16
04:08:21";00 00:09:48;HAR EXC A - Out Sum Fault failed to receive expected response. See Additional Information for details.;
;critical;2012-09-16 03:58:33;"2012-09-16
04:08:21";00 00:09:49;HAR EXC B - Out Sum Fault failed to receive expected response. See Additional Information for details.;
;critical;2012-09-16 04:05:46;"2012-09-16
[b]04:07:36";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
;critical;2012-09-16 03:55:46;"2012-09-16
04:01:53";00 00:01:08;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.;
[/b];critical;2012-09-16 03:54:02;"2012-09-16
04:07:51";00 00:13:49;SAT 2 TS NOT OK;[/quote]
Offline
A może zamiast kombinować z logiem, wykombinować inny program, bardziej "kumaty" w kontekście konfiguracji logowania, sensownego wyjścia do sysloga czy baz sql?
Albo inne wyjście logowania dla obecnego programu?
Co urodziło tego loga, jaki program czy może urządzenie?
Ostatnio edytowany przez Jacekalex (2012-09-18 07:28:49)
Offline
Ta a może jeszcze zaproponujesz żeby sam zrobił od nowa system czujek?
Ogólny schemat:
regexp dla miejsca -> do zmiennej
w petli sprawdzamy kolejne wpisy a warunkiem pętli jest regexp dla miejsca.
Ot wszystko, teraz zależenie w czym to zrobisz perl, PHP, bash/sh/zsh/etc. (tutaj może być trudniej ale wykonalne), python, itd.
Offline
@qluk
A wiesz może, co te logi generuje.
Bo jeśli to jakiś program, który da się zapiąć do sysloga, to sprawa byłaby XXX razy prostsza.
Zwłaszcza, że tam widzę jakiś wynik PING cośtam, a do takich rzeczy raczej nie kupuje się MS Windows 2158 serwer. ;)
Offline
Dziękuję wszystkim za odpowiedzi, napewno najłatwiej byłoby zmienić format pliku wyjściowego loga ale nie wiem jak podejdzie do sprawy dostawca oprogramowania monitorującego, czy w ogóle będzie chciał coś zmieniać. Logi generuje linux, które są przetwarzane przez jakiś "wynalazek" do formatu excela. Potem z kolei konwersja do formatu txt rozdzielonych znakami ";" Na chwilę obecną będę szedł w kierunku zaproponowanym przez qluk ale przed tym sprawdzę czy da się coś zmienić z dotychczasową formą logów.
Offline
Logi generuje linux, które są przetwarzane przez jakiś "wynalazek" do formatu excela.[/quote]
Jeśli możesz się jakoś dostać do logów generowanych przez Linuxa, to podejrzewam, że miałbyś dożo prostszą sytuację.
Jedyna format, w jakim Linux może wygenerować logi zjadliwe dla exela, to format CSV - tekst oddzielony przecinkami.
Sznurek: http://pl.wikipedia.org/wiki/CSV_%28format_pliku%29
Można też użyć formatu XML.
Gdybyś mógł wytargać ten plik - który jest zrobiony dla exela, to też mogłoby uprościć sprawę w jakimś stopniu.
Poza tym nie Linux generuje logi, bo pingowaniem nie zajmuje się kernel, tylko jakiś demon lub skrypt, który przygotowuje logi dla "wynalazku".
Radziłbym obejrzeć i proces w Linuxie, który samego dokonuje aktu pingowania i wypluwa logi, jak i wynalazkowi, który je formatuje dla exela.
Nie zdziwiłbym się, gdyby samym pingowaniem zajmował się jakiś sktypt napisany w bashu czy perlu.
Zwłaszcza, że tu masz [url=http://search.cpan.org/~smpeters/Net-Ping-2.36/lib/Net/Ping.pm]gotowy[/url] przykład takiego "dzieła do pingowania".
Względnie, czy ten "program od dostawcy", to nie jest przypadkiem oryginał lub klon Nagiosa lub Zabbixa.
Pozdrawiam
;-)Ostatnio edytowany przez Jacekalex (2012-09-20 05:33:17)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
Gdybym miał do tego dostęp to nie byłoby problemu. Ale niestety nie mam i muszę sobie radzić z tym co jest dostępne na chwilę obecną. Może Excel umie robić takie rzeczy ?
Offline
Jak nie masz dostępu - to skąd wiesz, że tam jest Linux? ;)
Jeśli koniecznie exel - i masz to w tabelkach exela, to exel może eksportować do formatu XML, a XML można obrabiać skryptami na 1200 sposobów, we wszystkich językach programowania.
Podobnie z resztą jak csv.
A w ogóle skąd się te dane biorą w exelu?
Jak są transportowane do exela?
Ostatnio edytowany przez Jacekalex (2012-09-20 05:32:01)
Offline
[quote=Jacekalex]Jak nie masz dostępu - to skąd wiesz, że tam jest Linux? ;)[/quote]
Niestety też go monitoruję (-: ale nie mam uprawnień żeby mu się przyjrzeć. Eksportowanie to połowiczne rozwiązanie problemu bo sam excel tego nie wyeksportuje a poszukuję rozwiązania które zautomatyzuje cały proces. Dane przesyłane na e-mail.
Offline
Przychodzą mailem? to jest ważna wiadomość.
W mailu jest jakiś załącznik, który wczytujesz do exela?
Czy exel sam nauczył się odbierać maile?
Czy kawałek tego pliku tekstowego, co wklejałeś wcześniej, to są dane wejściowe do exela, czy wyjściowe z exela w trybie jakiegoś eksportu?
Bo jakbyś sprawdził, w jakim formacie dane docierają do exela, to znacząco uprościłoby kombinowanie.
Sam plik tekstowy wygląda jak csv oddzielany średnikami.
Na "urządzeniu z Linuxem" nie masz nawet konta zwykłego użytkownika, ale go monitorujesz.
Czyli prawdopodobnie trzeba wziąść kij baseballowy i isć do administratora tego "urządzenia z Linuxem" ;)
Ostatnio edytowany przez Jacekalex (2012-09-20 06:54:52)
Offline
można zabawić się w sumy kontrolne wiersza. Może co dla nie których wydawać się śmieszne ale prawdziwe.
Mamy coś takiego:
;WWA - Zachodni .234;;;;;
;192.168.0.234;;;;;
;;;;;;
(....)
;TOR - PEC Aleks .222;;;;;
;192.168.0.222;;;;;
;;;;;;[/quote]
element dla sumy kontrolenej to [b];;;;;;[/b], czyli
1) sprawdz hash lini
2) jezeli jest rowne ';;;;;;' to
a) -2 w tablicy (lub -2 linie)
b) prerób na tablice
c) wycignij nazwe miasta
d) usuń w/w linie
e) wstaw na poczatek lini z logiem
to samo dla IP tylko -1
i to wszystko
[img]http://intershock.pl/images/icons/freebsd.jpg[/img] [img]http://www.the-eleven.com/site_media/static/img/postgresql_powered.png[/img] [img]http://www.wwgmc.com/images/badge_php.gif[/img]
LRU #480459
Offline
Jacekalex: uczepiłeś się jak rzep, to weż i napisz mu soft który bedzie do sysloga to robił. To że pisze PING nie znaczy że zostało wywołane /usr/bin/ping. Na dobrą sprawę to może być odpytanie czy czujka zwraca zielony kwadrat. Na cholerę wyważasz otwarte drzwi. Po co ma sobie dokładać roboty i wykraczać poza obowiązki skoro to co dostaje jest wystarczające i specjalnie od eksportu CSV się nie różni.
Offline
Zamiast napisać chłopakowi gotowca to się sprzeczacie.
Pisane na szybko:
awk -F "00 |;P" '/ \./;/PING/{getline a; if($2!~/00:00/) print $0 "\n" a }' log
Drukuje taki wynik:
userpc@userpc-desktop:~/Pulpit$ awk -F "00 |;P" '/ \./;/PING/{getline a; if($2!~/00:00/) print $0 "\n" a }' log ;WWA - Zachodni .234;;;;; 19:27:30";00 00:03:51;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 16:30:39;"2012-09-16 16:33:31";00 00:02:52;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 16:22:39;"2012-09-16 16:24:30";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 09:07:39;"2012-09-16 08:57:37";00 00:01:58;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 05:44:39;"2012-09-16 02:27:29";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 00:39:39;"2012-09-16 00:42:29";00 00:02:51;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 23:08:32;"2012-09-16 ;TOR - PEC Aleks .222;;;;; 04:07:36";00 00:01:50;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 03:55:46;"2012-09-16 04:01:53";00 00:01:08;PING Site Availability outage identified. Did not receive expected response within timeout 10000 ms.; ;critical;2012-09-16 03:54:02;"2012-09-16 userpc@userpc-desktop:~/Pulpit$
Ostatnio edytowany przez prosze (2012-09-25 17:59:22)
Offline
[quote=qluk]Jacekalex: uczepiłeś się jak rzep, to weż i napisz mu soft który bedzie do sysloga to robił. To że pisze PING nie znaczy że zostało wywołane /usr/bin/ping. Na dobrą sprawę to może być odpytanie czy czujka zwraca zielony kwadrat. Na cholerę wyważasz otwarte drzwi. Po co ma sobie dokładać roboty i wykraczać poza obowiązki skoro to co dostaje jest wystarczające i specjalnie od eksportu CSV się nie różni.[/quote]
@qluk
Nie czepiam się, tylko proponuję.
W dodatku, jedna uwaga:
Jakiś zasrany producent albo "fachowiec" zrobił "superzajefajnyprogram" - co sprawdza pingiem zdalne hosty, i zapisuje wynik badania w pliku csv dla exela,
w dodatku nie ma żadnej możliwości, żeby takiego pajaca lub producenta zmusić do tego, żeby program działający na Linuxie spełniał podstawowe standardy Linuxa.
I ten program nie ma żadnego cywilizowanego wyjścia funkcji - żeby wyciągnąć jakąś sensowną informację na poziomie Linuxa, poza zasranym CSV?
Piszesz, żebym ja napisał jakiś moduł do tego szajsprogramu, lub nowy od zera?
A ja bym najpierw poprosił producenta, jeśli to nie pomoże, to zrobił o problemie z producentem malutką stronkę, i wysłał mu linka.
Albo po prostu wypierdolił wypociny jakiegoś durnia, postawił Nagiosa albo Zabbixa, albo jeden z kilkunastu podobnych gotowych programów, albo rzeczywiście, naskrobał jakiś "pingownik" w perlu, z insertem wyniku do bazy SQL, Sysloga, i wysłaniem maila lub wiadomości xmpp jak host nie odpowie na 3 pingi w ciągu 15 minut.
Programista ze mnie żaden, może by mi to zajęło z tydzień, ale ja wiem, i Ty też wiesz, ze to ani niewykonalne, ani specjalnie trudne.
Inna sprawa, ze względem szajs-producentów bardzo pomaga delikatna perswazja, np:
- raz miałem kiedyś starcie z Insertem, dotyczące OscGT.
program wywalał ze sklepu produkt, który spadł do zerowego stanu magazynowego, i trzeba było wklepać dany produkt od nowa, zamiast uaktualnić stan magazynowy.
Napisałem do pomocy technicznej, odpisali ze to normalne, i nic nie poradzą.
Zadzwoniłem do jakiegoś ważniaka, - niestety, niemożliwe.
Napisałem na istniejącym wtedy forum Oscommerce, o problemie, pytając przy okazji, czy jest jakiś program zamiast OSCGT i Subiekta, bo mi wypociny Insertu działają na nerwy, a ważniakowi wysłałem sznurka do postu.
Za 2 godziny ważniak odpisał prosząc o logi debug, napisał jak włączyć logowanie w konfigu, i dał ladres łebka "odpowiedzialnego", natomiast jak dostali logi, to obiecali, ze za dwa dni będzie aktualizacja, i to będzie poprawione.
I rzeczywiście, za 3 dni było po problemie.
Można?
Jak płacisz, to i wymagasz, jak nie płacisz, robisz sam.
Proste?
A każdej firmie co jakiś czas trzeba pokazać palec jak przeginają , żeby ruszyli jaśniepaństwo doooopy, Stolarz, Insert czy Nvidia, nie ma żadnej różnicy. :DDDDDD
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-09-26 07:02:57)
Offline
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00130 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.219.15.112' WHERE u.id=1 |
0.00076 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.219.15.112', 1732730569) |
0.00047 | SELECT * FROM punbb_online WHERE logged<1732730269 |
0.00216 | DELETE FROM punbb_online WHERE ident='3.145.61.199' |
0.00055 | SELECT topic_id FROM punbb_posts WHERE id=211745 |
0.00260 | SELECT id FROM punbb_posts WHERE topic_id=21997 ORDER BY posted |
0.00061 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=21997 AND t.moved_to IS NULL |
0.00016 | SELECT search_for, replace_with FROM punbb_censoring |
0.00105 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=21997 ORDER BY p.id LIMIT 0,25 |
0.00087 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=21997 |
Total query time: 0.0107 s |