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
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
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
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