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-12-18 20:53:45

  R_Przemek - Użytkownik

R_Przemek
Użytkownik
Zarejestrowany: 2013-05-28

Bash, Sed i operacje na tekście...

Witam

Mam drobny problem z załapaniem metody na realizację pewnego zadania, mianowicie:

Jest plik:

Kod:

lease 10.0.0.13 {
  starts 0 2016/12/18 08:36:36;
  ends 0 2016/12/18 09:06:36;
  tstp 0 2016/12/18 09:06:36;
  cltt 0 2016/12/18 08:36:36;
  binding state free;
  hardware ethernet 08:00:27:68:c0:df;
  uid "\001\010\000'h\300\337";
}
lease 10.0.0.14 {
  starts 0 2016/12/18 19:09:04;
  ends 0 2016/12/18 19:14:04;
  cltt 0 2016/12/18 19:09:04;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 08:00:27:13:f0:f5;
  uid "\001\010\000'\023\360\365";
  set vendor-class-identifier = "MSFT 5.0";
  client-hostname "e5f75cdd4e10467";
}
lease 10.0.0.14 {
  starts 0 2016/12/18 19:11:34;
  ends 0 2016/12/18 19:16:34;
  cltt 0 2016/12/18 19:11:34;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 08:00:27:13:f0:f5;
  uid "\001\010\000'\023\360\365";
  set vendor-class-identifier = "MSFT 5.0";
  client-hostname "e5f75cdd4e10467";
}

I teraz chcę pobierać po jednym bloku leases { ... } do zmiennej.

W moim sh mam pętlę, która wykonuje się tyle razy ile w pliku jest wystąpień " lease  { " czyli adresów IP.

dalej robię:

Kod:

ip=$(echo "$plik_z_danymi" | grep 'lease' | grep '{' | awk '{print $2}'; );
blok_lease=$(sed -n -e "/lease $ip {/,/^}/p" "$plik_z_danymi");

I to jest OK do chwili kiedy w pliku, tak jak wyżej napisałem nie pojawią się dwa lub więcej bloków z tym samym adresem IP.
Wtedy w mojej zmiennej $blok_lease ląduje nie pierwszy napotkany blok, ale wszystkie z tym samym adresem.

Czy ma ktoś pomysł na modyfikację mojego seda tak aby po dopasowaniu się po raz pierwszy kończył działanie a nie leciał do końca pliku ?

Offline

 

#2  2016-12-19 06:07:10

  janosik - Członek DUG

janosik
Członek DUG
Zarejestrowany: 2009-05-06

Re: Bash, Sed i operacje na tekście...

Na moją logikę to w każdym obrocie pętli zrzucasz zmienną do pliku.
Pytanie - czy IP mogą wystąpić w przypadkowych miejscach, czy zawsze występują po sobie?
Jeśli po sobie to przed kolejnym obrotem można porównać IP z poprzedniej iteracji i wsio. Jeśli nie, to mało elegancko można zajrzeć do pliku

Offline

 

#3  2016-12-19 07:08:19

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Bash, Sed i operacje na tekście...

Kod:

ip=$(echo "$plik_z_danymi" | grep 'lease' | grep '{' | awk '{print $2}' | sort -u; ) ;

Ostatnio edytowany przez djjanek (2016-12-19 07:08:44)

Offline

 

#4  2016-12-19 07:34:58

  R_Przemek - Użytkownik

R_Przemek
Użytkownik
Zarejestrowany: 2013-05-28

Re: Bash, Sed i operacje na tekście...

Tak, w każdym obrocie loopa wkładam zmienną do pliku, albo sobie ją od razu obrabiam według potrzeb.
Tylko Jak wsadzić dokładnie jeden blok tekstu do zmiennej ? Nie jest to problemem jeśli po każdym słowie "leases" jest inny adres IP
jednak gdy są dwa takie same początki "lease 10.0.0.14 {" to w tej zmiennej lądują mi dwa bloki...

Chciał bym napisać coś takiego:

Kod:

sed -n -e "/lease $ip {/,/^}/p" 'ale tylko pierwsze wystąpienie' "$plik_z_danymi"

ewentualnie zapisać sobie do zmiennej numer wiersza w którym jest fraza "lease" "{" i napisać:
wkładaj do zmiennej od $numer_wiersza do pierwszego wystąpienia " } ".

jednak tutaj nie wiem jak pokazać numer linii jako efekt szukania i nie jestem pewiem czy coś takiego zadziała:

Kod:

numer_wiersza='4'; ## inny kawałek kodu mi to stwierdza
blok_lease=$(sed -n -e "/$numer_wiersza/,/^}/p" "$plik_z_danymi");

Offline

 

#5  2016-12-21 19:30:21

  seler - Użytkownik

seler
Użytkownik
Zarejestrowany: 2012-05-15

Re: Bash, Sed i operacje na tekście...

R_Przemek napisał(-a):

...
Czy ma ktoś pomysł na modyfikację mojego seda tak aby po dopasowaniu się po raz pierwszy kończył działanie a nie leciał do końca pliku ?

Dosyć zagmatwanie napisałeś co chcesz w ogóle zrobić, ale jeśli tylko to co powyżej to ja użyłbym tutaj grepa, np.

Kod:

grep -m 1 -E "^lease $ip {" "$plik_z_danymi"

a jeśli koniecznie chcesz seda, to
http://stackoverflow.com/questions/20943025/how-can … address-range

Ostatnio edytowany przez seler (2016-12-21 19:32:32)


a to feler westchnął seler

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)