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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2016-03-06 17:15:06

  MarekO - Użytkownik

MarekO
Użytkownik
Skąd: Mińsk Maz.
Zarejestrowany: 2008-03-11

jak to parsować ?

jest sobie log który ma sporo wpisów (ramek) i z całego loga chce wyciągnąć tylko te

Kod:

 ______________________________________________________________________________
| (119631:000075) Physical-Event :
| long: 49  desti: 0  source: 0  cryst: 1  cpl: 2  us: 0  term: 0  type a5 
| tei: 0  >>>>  message received : SETUP [05]    Call ref :  59 44
|______________________________________________________________________________
|
| IE:[04] BEARER_CAPABILITY (l=3) 80 90 a3 
| IE:[18] CHANNEL (l=3)  a9 83 92 -> T2 : B channel 18 exclusive
| IE:[6c] CALLING_NUMBER (l=11)  ->  21  81  Num : 123456789
| IE:[70] CALLED_NUMBER (l=5)  ->  81  Num : 567890123
| [a1] Sending complete
|______________________________________________________________________________

 ______________________________________________________________________________
| (119631:000076) 1268: Send_IO1 (link-nbr=1, sapi=0, tei=0) :
| long: 23  desti: 0  source: 15  cryst: 1  cpl: 2  us: 8  term: 0  type a5 
| tei: 0  <<<<  message sent : CALL PROC (02)  Call ref :  d9 44
|______________________________________________________________________________
|
| IE:[18] CHANNEL (l=3)  a9 83 92 -> T2 : B channel 18 exclusive
|______________________________________________________________________________

tu są tylko dwie ramki i charakteryzują się wpisem w wierszu zaczynającym się od tei:... 9 44 czyli cztery ostatnie znaki z wiersza
jak na podstawie tych czterech znaków wyciągnąć całą ramkę ? jedna ma 12 wierszy a druga 8.


Jeszcze tu wrócę ...

Offline

 

#2  2016-03-06 17:37:14

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Skąd: Białystok
Zarejestrowany: 2007-06-24

Re: jak to parsować ?

I każda ramka 59 44 ma 12 wierszy i każda d9 44 ma 8?

Jeżeli tak to:

Kod:

grep '59 44'  -B3 -A8 log.txt  
grep 'd9 44'  -B3 -A4 log.txt

EDIT:
Krótkie wyjaśnienie co robią parametry -A i -B:
[quote=man grep]Context Line Control
       -A NUM, --after-context=NUM
              Print NUM  lines  of  trailing  context  after  matching  lines.
              Places   a  line  containing  a  group  separator  (--)  between
              contiguous groups of matches.  With the  -o  or  --only-matching
              option, this has no effect and a warning is given.

       -B NUM, --before-context=NUM
              Print  NUM  lines  of  leading  context  before  matching lines.
              Places  a  line  containing  a  group  separator  (--)   between
              contiguous  groups  of  matches.  With the -o or --only-matching
              option, this has no effect and a warning is given.[/quote]

Ostatnio edytowany przez Piotr3ks (2016-03-06 17:43:04)

Offline

 

#3  2016-03-06 18:18:37

  MarekO - Użytkownik

MarekO
Użytkownik
Skąd: Mińsk Maz.
Zarejestrowany: 2008-03-11

Re: jak to parsować ?

fajnie, ale :)
ramka 59 44 tylko raz ma 12 wierszy, później ma  po 8, a są też ramki bardziej rozbudowane, więc ta wartośc jest zmienna. Myślałem żeby zczytywać wiersze do drugiego wystąpienia wzorca "|_________" to jest wzór kończący całą ramkę niezależnie od jej rozmiaru.
1) znam wartość jaka musi wystąpić w ramce
2) wiem już jak wyłapać początek tej ramki '-B3'
3) nie wiem jak łapac koniec przy zmiennej dlugości
może to zrobić jakąś pętlą ?


Jeszcze tu wrócę ...

Offline

 

#4  2016-03-06 18:25:42

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Skąd: Białystok
Zarejestrowany: 2007-06-24

Re: jak to parsować ?

Między ramkami jest pusty wiersz?

Jeżeli tak to:

Kod:

cat log.txt | csplit -s - '/^$/'

Jak to wykonasz to każdą pojedynczą ramkę zapisze Ci do oddzielnego pliku (pod warunkiem, że między ramkami jest pusta linia).

EDIT:

No i jak już będziesz miał każdą ramkę w oddzielnym pliku to sobie już pętlą for i grepem przelecisz po tych plikach.

Ostatnio edytowany przez Piotr3ks (2016-03-06 18:56:41)

Offline

 

#5  2016-03-06 19:52:14

  MarekO - Użytkownik

MarekO
Użytkownik
Skąd: Mińsk Maz.
Zarejestrowany: 2008-03-11

Re: jak to parsować ?

tego nie znałem, ale wyszło tak, że zrobił 2 pliki i w pierwszym jest pierwsza ramka a w drugim reszta, a źródełko wygląda tak

Kod:

 ______________________________________________________________________________
| (119631:000075) Physical-Event :
| long: 49  desti: 0  source: 0  cryst: 1  cpl: 2  us: 0  term: 0  type a5 
| tei: 0  >>>>  message received : SETUP [05]    Call ref :  59 44
|______________________________________________________________________________
|
| IE:[04] BEARER_CAPABILITY (l=3) 80 90 a3 
| IE:[18] CHANNEL (l=3)  a9 83 92 -> T2 : B channel 18 exclusive
| IE:[6c] CALLING_NUMBER (l=11)  ->  21  81  Num : 123456789
| IE:[70] CALLED_NUMBER (l=5)  ->  81  Num : 567890123
| [a1] Sending complete
|______________________________________________________________________________

 ______________________________________________________________________________
| (119631:000076) 1268: Send_IO1 (link-nbr=1, sapi=0, tei=0) :
| long: 23  desti: 0  source: 15  cryst: 1  cpl: 2  us: 8  term: 0  type a5 
| tei: 0  <<<<  message sent : CALL PROC (02)  Call ref :  d9 44
|______________________________________________________________________________
|
| IE:[18] CHANNEL (l=3)  a9 83 92 -> T2 : B channel 18 exclusive
|______________________________________________________________________________

 ______________________________________________________________________________
| (119631:000077) 1268: Send_IO1 (link-nbr=1, sapi=0, tei=0) :
| long: 22  desti: 0  source: 15  cryst: 1  cpl: 2  us: 8  term: 0  type a5 
| tei: 0  <<<<  message sent : ALERT (01)  Call ref :  d9 44
|______________________________________________________________________________
|
| IE:[1e] PROGRESS_ID (l=2) 81 88 
|______________________________________________________________________________

 ______________________________________________________________________________
| (119668:000078) Physical-Event :
| long: 22  desti: 0  source: 0  cryst: 1  cpl: 2  us: 0  term: 0  type a5 
| tei: 0  >>>>  message received : DISCONNECT [45]  Call ref :  59 44
|______________________________________________________________________________
|
| IE:[08] CAUSE (l=2) 81 90 -> [90] NORMAL CALL CLEARING
|______________________________________________________________________________

 ______________________________________________________________________________
| (119668:000079) 1268: Send_IO1 (link-nbr=1, sapi=0, tei=0) :
| long: 22  desti: 0  source: 15  cryst: 1  cpl: 2  us: 8  term: 0  type a5 
| tei: 0  <<<<  message sent : RELEASE [4d]   Call ref :  d9 44
|______________________________________________________________________________
|
| IE:[08] CAUSE (l=2) 81 90 -> [90] NORMAL CALL CLEARING
|______________________________________________________________________________

 ______________________________________________________________________________
| (119669:000080) Physical-Event :
| long: 22  desti: 0  source: 0  cryst: 1  cpl: 2  us: 0  term: 0  type a5 
| tei: 0  >>>>  message received : REL COMP [5a]  Call ref :  59 44
|______________________________________________________________________________
|
| IE:[08] CAUSE (l=2) 81 90 -> [90] NORMAL CALL CLEARING
|______________________________________________________________________________

Jeszcze tu wrócę ...

Offline

 

#6  2016-03-06 19:58:45

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Skąd: Białystok
Zarejestrowany: 2007-06-24

Re: jak to parsować ?

No to mała poprawka:

Kod:

csplit -s log.txt '/^$/' '{*}'

Ostatnio edytowany przez Piotr3ks (2016-03-06 19:58:56)

Offline

 

#7  2016-03-06 20:29:28

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: jak to parsować ?

Ja do takich kfiatków zazwyczaj zatrudniam Perla:
https://forum.dug.net.pl/viewtopic.php?id=22977

A tak poza tym, to co za program generuje te logi?
- może da się tam wytargać dane w bardziej zjadliwej formie.

Ostatnio edytowany przez Jacekalex (2016-03-06 20:31:09)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#8  2016-03-06 20:48:15

  MarekO - Użytkownik

MarekO
Użytkownik
Skąd: Mińsk Maz.
Zarejestrowany: 2008-03-11

Re: jak to parsować ?

zdecydowanie lepiej, czyli tak:
1) przepuszczam plik przez csplita wychodzi z tego z 1000 plików
2) przeszukuje pliki w poszukiwaniu ciągu '123456789' <- grep -l 123456789 * ?
3) w znalezionym pliku zczytuję ostatnie 4 znaki wiersza zaczynającego się od 'tei' <- [s]tu już nie wiem jak[/s] grep tei|tail -c 5
4) przeglądam kolejno pliki w poszukiwaniu łańcucha z pkt3 i jeśli znajde to dorzucam do wyniku cały plik

Ostatnio edytowany przez MarekO (2016-03-06 23:15:54)


Jeszcze tu wrócę ...

Offline

 

#9  2016-03-06 21:02:30

  MarekO - Użytkownik

MarekO
Użytkownik
Skąd: Mińsk Maz.
Zarejestrowany: 2008-03-11

Re: jak to parsować ?

Jacekalex

nie mam na maszynie docelowej perla i muszę sobie radzić podstawowymi narzędziami
a te logi to jest ruch na karcie ISDN i to jest bardziej zjadliwa forma, podstawowa to RAW częściowo tłumaczony na czytelny a większość danych szesnastkowo :)


Jeszcze tu wrócę ...

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00012 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00098 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='3.149.250.65' WHERE u.id=1
0.00067 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.149.250.65', 1732631517)
0.00042 SELECT * FROM punbb_online WHERE logged<1732631217
0.00058 SELECT topic_id FROM punbb_posts WHERE id=298721
0.00004 SELECT id FROM punbb_posts WHERE topic_id=28356 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=28356 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00175 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=28356 ORDER BY p.id LIMIT 0,25
0.00079 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28356
Total query time: 0.00605 s