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
[quote=R_Przemek]...
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 ?[/quote]
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-i-get-sed-to-quit-after-the-first-matching-address-range
Ostatnio edytowany przez seler (2016-12-21 19:32:32)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00010 | SET NAMES latin2 |
0.00108 | 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='18.221.98.71' WHERE u.id=1 |
0.00076 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.221.98.71', 1714964095) |
0.00058 | SELECT * FROM punbb_online WHERE logged<1714963795 |
0.00092 | DELETE FROM punbb_online WHERE ident='18.222.239.77' |
0.00079 | DELETE FROM punbb_online WHERE ident='18.223.172.224' |
0.00091 | DELETE FROM punbb_online WHERE ident='47.128.118.222' |
0.00080 | DELETE FROM punbb_online WHERE ident='47.128.32.84' |
0.00074 | SELECT topic_id FROM punbb_posts WHERE id=307723 |
0.00063 | SELECT id FROM punbb_posts WHERE topic_id=29244 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=29244 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00085 | 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=29244 ORDER BY p.id LIMIT 0,25 |
0.00106 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29244 |
Total query time: 0.01 s |