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:

man grep napisał(-a):

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.

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/random
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' <- tu już nie wiem jak 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 ;-)