Mam skrypt, który generuje dane wyjściowe. Chcę sprawdzić to wyjście dla dowolnego adresu IP, takiego jak
159.143.23.12
134.12.178.131
124.143.12.132
if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //
To fgrep
dobry pomysł?
Mam dostępne bash.
shell-script
grep
ip
Koshur
źródło
źródło
0010.0000.0000.0001
? Czy plik może zawierać elementy wyglądające jak adresy IP, takie jak numery wersji (soft-1.2.1100.1.tar.gz
specyfikacje sieci (10.0.0.0/24), 1.2.3.4.5)? Czy zaakceptowałbyś rozwiązanie pozytywne na 333.444.555.666? Lub0377.0377.0377.0377
(prawidłowy czteroktowy adres IP)?bash
jest dostępny, toawk
zwykle jest również, więc może to działać dla ciebie:awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'
(Ten linijka tłumaczy dane wyjściowe z listy XFR hosta na/etc/hosts
format).Odpowiedzi:
Tak, masz wiele opcji / narzędzi do użycia. Właśnie próbowałem tego, działa:
ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
więc możesz użyć
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
do grepowania adresów IP z twojego wyjścia.źródło
"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"
do znalezienia CIDR-ów (zakładając, że są one prawidłowe)zaczynając moją odpowiedź na podstawie tej odpowiedzi:
i konwertowanie odpowiedzi na pełną długość IPv6 itp.:
jeśli chcesz zachować / nnn, jeśli tam jest:
a także istnieje skrócona wersja IPv6, która zawiera „::”.
więcej odpowiedzi na IPv6 można znaleźć tutaj: /programming/53497/regular-expression-that-matches-valid-ipv6-addresses
źródło
fgrep
to stara nazwa wariantu,grep
który ignoruje dopasowanie wzorca. Polecam zamiast tego użyćgrep
(a nawetegrep
), zwłaszcza, że wyraźnie chcesz dopasować wzór.Jeśli twój plik jest nazywany np.
ips
Możesz napisać coś takiego:Następnie możesz przekazać parametry zgodnie ze skryptem
źródło
Mam nadzieję, że przetestowany w SmartOS (wariant Solaris) powinien działać w innych środowiskach * nix:
Przykład:
Ten wzorzec pasuje tylko ważny IPv4, czyli
x.x.x.x
gdziex
wahać się od 0-255. Jeśli chcesz wyodrębnić tylko pasujący adres IP, dodaj-o
opcję do powyższego polecenia. Możesz osadzić to polecenie w skrypcie bash i prawdopodobnie także w innych skryptach powłoki. A jeśliegrep
zawiedzie,try grep -E ...
Używanie go w skrypcie powłoki (bash):
ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip
źródło
Jeśli masz listę adresów IP w pliku, po jednym w wierszu, masz
grep
już wygodną-f
opcję:Może to powodować kilka fałszywych trafień ze względu na ciągi opcjonalnie poprzedzone inną liczbą, aby zmienić adres IP. Wiele rzeczy możesz na to poradzić, w zależności od przypadku możesz się martwić.
źródło
Myślę, że moja odpowiedź na inny post jest bardziej odpowiednia tutaj. Dzięki temu postowi i innym podobnym wymyśliłem ten, który szuka poprawnego formatu IP, a następnie pozbywa się wszystkich wierszy zawierających 256 lub więcej. Zastąp adres IP czymś, co jest nieprawidłowe, aby zamiast tego nie wyświetlać danych wyjściowych:
Pierwszy grep został prawdopodobnie znaleziony w tym poście i sprawdza, czy istnieją liczby od 0-999 w formacie XXXX
Drugi grep usuwa linie o numerach 256-999, pozostawiając tylko prawidłowe adresy IP formatu, tak myślałem
ALE ... Jak zauważył G-Man, popełniłem błąd, zakładając, że IP będzie na jego własnej linii. Najczęściej jednak po każdej stronie adresu IP będzie spacja lub inny dzielnik. Spacje / dzielniki można usunąć za pomocą sed lub w inny sposób po znalezieniu IP. Dodałem również -o do pierwszego grep:
Pierwszy i drugi nie dają żadnego wyniku, podczas gdy trzeci robi, a spacje są usuwane.
źródło
grep
wyrzuciłaby tę linię z powodu „500”. (Pytanie nigdy nie mówiło, że adres (y) IP w pliku, jeśli taki istnieje, będą same w linii.) Z drugiej strony zaakceptuje 1234.1.1.1 i 1.1.1.1234. Ale poza tym nieźle.Przekieruj to wyjście do niektórych
outputFile
Po prostu
grep
ze wzorem jak,źródło
.
jest operatorem wyrażeń regularnych i musi uciec, aby można go było traktować dosłownieźródło