Bagaimana memeriksa apakah ada alamat IP dalam file menggunakan skrip shell?


13

Saya memiliki skrip yang menghasilkan beberapa keluaran. Saya ingin memeriksa output itu untuk alamat IP seperti apa

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

Apakah fgrepide yang bagus?

Saya memiliki bash tersedia.


gunakan grep, egrep, awk, atau sed, terserah kamu
Ijaz Ahmad Khan

Bisakah Anda membantu dengan sintaksisnya? Maksud saya bagaimana cara mencari IP acak. Bagaimana cara menggambarkan polanya? Saya akan mencari alamat IP apa pun, bukan alamat tertentu.
Koshur

5
Apakah itu hanya alamat IPv4 dalam notasi quad-desimal? Mungkinkah itu ditulis 0010.0000.0000.0001? Bolehkah file tersebut berisi hal-hal yang terlihat seperti alamat IP seperti nomor versi ( soft-1.2.1100.1.tar.gz, spesifikasi jaringan (10.0.0.0/24), 1.2.3.4.5)? Apakah Anda akan menerima solusi yang positif di 333.444.555.666? Atau 0377.0377.0377.0377(alamat IP quad-oktal yang valid)?
Stéphane Chazelas

Jika bashtersedia, maka awkbiasanya juga, jadi ini mungkin bekerja untuk Anda: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(Satu-liner ini menerjemahkan output dari daftar host XFR ke /etc/hostsformat.)
Mark Hudson

Jawaban:


25

Ya, Anda memiliki banyak opsi / alat untuk digunakan. Saya baru saja mencoba ini, ini berhasil:

ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

sehingga Anda dapat menggunakan grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"untuk mengambil alamat ip dari output Anda.


Terima kasih. Ini bekerja. Bisakah Anda jelaskan sedikit? Apakah ini ekspresi reguler?
Koshur

Ya ini adalah ekspresi reguler yang digunakan dalam bash dengan grep, Anda hanya mencari pola tiga digit yang dipisahkan oleh titik-titik. Anda dapat bermain dengan mengubah angka dalam {1,2} untuk 2 digit berturut-turut dan seterusnya
Ijaz Ahmad Khan

Satu juga dapat digunakan "\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"untuk menemukan CIDR (dengan asumsi mereka valid)
vikas027

2

mulai jawaban saya berdasarkan jawaban ini:

Ya, Anda memiliki banyak opsi / alat untuk digunakan. Saya baru saja mencoba ini, ini berhasil:

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b" a sehingga Anda dapat menggunakan grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b "untuk mengambil alamat ip dari output Anda.

dan mengubah jawaban menjadi IPv6 panjang penuh, dll ...:

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

jika Anda ingin menyimpan / nnn jika ada:

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

dan juga ada versi singkat IPv6 yang mencakup '::'.

untuk jawaban IPv6 lainnya, Anda dapat melihat di sini: /programming/53497/ regular-expression-that-matches-valid-ipv6-addresses


fgrepadalah nama lama untuk varian grepyang mengabaikan pencocokan pola. Saya sarankan Anda menggunakan grep(atau bahkan egrep) sebagai gantinya, terutama karena Anda jelas menginginkan pencocokan pola.
roaima

2

Jika file Anda dipanggil misalnya ipsAnda dapat menulis sesuatu seperti:

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

Kemudian Anda dapat melewatkan parameter sebagai ikuti skrip

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

0

Jika Anda memiliki daftar IP dalam file, satu per baris, grepsudah memiliki -fopsi yang mudah :

$ 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.)

Ini dapat menyebabkan beberapa kesalahan positif karena string secara opsional diikuti oleh nomor lain untuk menjadikannya IP yang berbeda. Banyak hal yang dapat Anda lakukan, tergantung pada kasus Anda, Anda mungkin atau mungkin tidak memutuskan untuk khawatir.


0

Diuji dalam SmartOS (varian Solaris), semoga bekerja di lingkungan * nix lainnya:

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])'

Contoh:

$ 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

Pola ini cocok hanya berlaku IPv4, yaitu, x.x.x.xdi mana xberkisar dari 0-255. Jika Anda hanya perlu mengekstrak IP yang cocok, tambahkan -oopsi ke perintah di atas. Anda bisa menanamkan perintah ini dalam skrip bash dan mungkin juga di skrip shell lain. Dan, jika egrepgagal,try grep -E ...

Menggunakannya dalam skrip shell (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


0

Saya pikir jawaban saya untuk posting lain lebih cocok di sini. Berkat posting ini dan yang lain-lain yang seperti itu saya datang dengan ini, yang mencari format IP yang benar, kemudian menghilangkan semua baris yang berisi 256 atau lebih tinggi. Ganti IP dengan sesuatu yang tidak valid untuk melihat tidak ada output sebagai gantinya:

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

Grep pertama mungkin ditemukan di pos ini dan memeriksa nomor dari 0-999 dalam format XXXX

Grep kedua menghapus garis dengan angka 256-999, sehingga hanya menyisakan IP format yang valid, jadi saya pikir

TAPI ... Seperti yang ditunjukkan oleh G-Man, saya keliru dengan menganggap IP akan berada di jalurnya sendiri. Paling selalu, akan ada ruang atau pembagi lain untuk dicari di kedua sisi IP. Spasi / pembagi dapat dihapus dengan sed atau cara lain setelah IP ditemukan. Saya juga menambahkan -o ke grep pertama:

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

Yang pertama dan kedua tidak akan menghasilkan output, sedangkan yang ketiga tidak dan spasi dilucuti.


Misalkan saya memiliki 500 alamat, mulai dari 10.0.0.1 hingga 10.0.1.244. Kedua Anda grepakan membuang garis itu karena "500". (Pertanyaan tidak pernah mengatakan bahwa alamat IP dalam file, jika ada, akan terhubung sendiri). Di sisi lain, ia akan menerima 1234.1.1.1 dan 1.1.1.1234. Tapi selain itu, tidak buruk.
G-Man Mengatakan 'Reinstate Monica'

-1

Redirect output itu ke beberapa outputFile

Cukup grepdengan pola sebagai,

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>

4
Perhatikan bahwa .ini adalah operator ekspresi reguler dan perlu melarikan diri untuk diperlakukan secara harfiah
Stéphane Chazelas

1
Itu bukan pola, itu literal. Bukan jawaban yang berguna karena OP menentukan "IP apa pun."
Mark Hudson

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.