Jak sprawdzić, czy w pliku znajduje się adres IP za pomocą skryptów powłoki?

14

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 fgrepdobry pomysł?

Mam dostępne bash.

Koshur
źródło
użyj grep, egrep, awk lub sed, cokolwiek lubisz
Ijaz Ahmad Khan
Czy mógłbyś pomóc w składni? Mam na myśli, w jaki sposób wyszukuje losowe IP. Jak opisać wzór? Szukałbym dowolnego adresu IP, a nie konkretnego adresu.
Koshur,
5
Czy to tylko adresy IPv4 w notacji dziesiętnej? Czy mogą być napisane jak 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.gzspecyfikacje sieci (10.0.0.0/24), 1.2.3.4.5)? Czy zaakceptowałbyś rozwiązanie pozytywne na 333.444.555.666? Lub 0377.0377.0377.0377(prawidłowy czteroktowy adres IP)?
Stéphane Chazelas
Jeśli bashjest dostępny, to awkzwykle 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/hostsformat).
Mark Hudson,

Odpowiedzi:

27

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.

Ijaz Ahmad Khan
źródło
Dzięki. To działa. Czy możesz coś wyjaśnić? Czy to jest wyrażenie regularne?
Koshur
Tak, jest to wyrażenie regularne używane w bashie z grep, po prostu szukasz wzorca trzech cyfr oddzielonych kropkami. możesz grać, zmieniając liczby w {1,2} na 2 kolejne cyfry i tak dalej
Ijaz Ahmad Khan
Można także użyć "\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)
vikas027
2

zaczynając moją odpowiedź na podstawie tej 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" a, więc możesz użyć grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b ", aby grepować adresy IP z twojego wyjścia.

i konwertowanie odpowiedzi na pełną długość IPv6 itp.:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file

jeśli chcesz zachować / nnn, jeśli tam jest:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file

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

Bryan Ritter
źródło
fgrepto stara nazwa wariantu, grepktóry ignoruje dopasowanie wzorca. Polecam zamiast tego użyć grep(a nawet egrep), zwłaszcza, że ​​wyraźnie chcesz dopasować wzór.
roaima
2

Jeśli twój plik jest nazywany np. ipsMożesz napisać coś takiego:

while read -r ip
    do
        if [[ $ip == "$1" ]]; then
            shift
            printf '%s\n' 'action to take if match found'
        else
            printf '%s\n' 'action to take if match not found'
        fi
    done < ips

Następnie możesz przekazać parametry zgodnie ze skryptem

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132
Valentin Bajrami
źródło
1

Mam nadzieję, że przetestowany w SmartOS (wariant Solaris) powinien działać w innych środowiskach * nix:

egrep '(([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])'

Przykład:

$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411

$ egrep '(([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
IP1: 192.168.1.1

Ten wzorzec pasuje tylko ważny IPv4, czyli x.x.x.xgdzie xwahać się od 0-255. Jeśli chcesz wyodrębnić tylko pasujący adres IP, dodaj -oopcję do powyższego polecenia. Możesz osadzić to polecenie w skrypcie bash i prawdopodobnie także w innych skryptach powłoki. A jeśli egrepzawiedzie,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

Ganapatia
źródło
Działa to dobrze w systemie CentOS 6, grep 2.6.3
David Ramirez
0

Jeśli masz listę adresów IP w pliku, po jednym w wierszu, masz grepjuż wygodną -fopcję:

$ man fgrep | grep file= -A1
       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f is specified by POSIX.)

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

chutz
źródło
0

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:

echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'

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:

echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.100 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

Pierwszy i drugi nie dają żadnego wyniku, podczas gdy trzeci robi, a spacje są usuwane.

eyez
źródło
Załóżmy, że mam 500 adresów, od 10.0.0.1 do 10.0.1.244. Twoja sekunda grepwyrzucił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.
G-Man mówi „Przywróć Monikę”
-1

Przekieruj to wyjście do niektórych outputFile

Po prostu grepze wzorem jak,

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
Keyshov Borate
źródło
4
Zauważ, że .jest operatorem wyrażeń regularnych i musi uciec, aby można go było traktować dosłownie
Stéphane Chazelas
1
To nie są wzory, to są dosłowne. Nie jest to przydatna odpowiedź, ponieważ PO określił „dowolny adres IP”.
Mark Hudson
-1
ip -4  addr show eth1 |  grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Smit Jain
źródło