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/.
Strony: 1
Witam
Mam drobny problem z załapaniem metody na realizację pewnego zadania, mianowicie:
Jest plik:
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ę:
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

Członek DUG


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



Użytkownik
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:
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:
numer_wiersza='4'; ## inny kawałek kodu mi to stwierdza blok_lease=$(sed -n -e "/$numer_wiersza/,/^}/p" "$plik_z_danymi");
Offline

Użytkownik


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.
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)
Offline
Strony: 1