Mam długą listę adresów IP, które nie są w kolejności. Muszę znaleźć liczbę adresów IP przed / po określonym adresie IP. Jak mogę to osiągnąć?
shell-script
text-processing
Mandar Shinde
źródło
źródło
Odpowiedzi:
Liczba linii przed i po meczu, w tym dopasowanie (tzn. Musisz odjąć 1 od wyniku, jeśli chcesz wykluczyć dopasowanie):
Nie ma to jednak żadnego związku z adresami IP.
źródło
Może najłatwiej jest
Dzięki @JoshepR za wskazanie błędu
źródło
dc
siebie.Zrobiłem to na dwa sposoby, ale myślę, że najbardziej to lubię:
To zapisuje wszystkie te zmienne jako bieżące zmienne powłoki - i następnie ocenia je w pętli for w celu uzyskania wyniku. Liczy całkowitą liczbę linii w pliku
wc
i pobiera pierwszą dopasowaną liczbę linii za pomocąsed
.Jego wydajność:
Zrobiłem również:
sed
wypisuje tylko pasujące i ostatnie numery linii, a następnietr
tłumaczy pośrednie\n
ewline nairead
wczytuje pierwszy zsed
wyników do,$ml
a wszystkie pozostałe do$ll
. Możliwe przypadki wielokrotnych dopasowań są obsługiwane przez usunięcie wszystkich wyników poza$ll
rozszerzeniem z rozwinięcia przy ustawianiu go ponownie później.Jego wydajność:
Obie metody zostały przetestowane na pliku wygenerowanym w następujący sposób:
Według numeru wiersza:
"$IP"
następnie\n
ewlinetr
- co przekłada zera na\n
ewline na~/file
źródło
Oto trochę kodu Perla, który to robi:
Zlicza całkowitą liczbę linii przed i po linii zawierającej adres IP
192.168.1.1
. Zastąp żądanym adresem IP.Używanie tylko Bash:
źródło
$.
zamiast licznika?$after
na$. - $before
.$. - 1
, zapisz$.
w$tmp
. Koniec wydruku$. - $tmp
. Więc nie potrzebujemy licznika zarówno przed jak i po. Oczywiście jest mniej czytelny niż twój.Próbowałem następujących poleceń, które są nieco skomplikowane, ale dałyby dokładne wyniki:
Po:
Przed:
źródło
awk
Raportowania liczby linii przed i po ostatnim meczu rozwiązanieźródło
Grep
ma funkcję, która może zliczyć liczbę znalezienia określonego wzorca. Jeśli użyjesz-c
polecenia, które to zrobi. Za pomocą polecenia-c
i-v
będzie to liczyć, ile razy nie pasuje to do określonego wzorcaPrzykład:
grep -c -v <pattern> file
Więc jeśli spróbujesz czegoś takiego:
grep -c -v 192.168.x.x file.log
to powinno działać.źródło