grep untuk menampilkan semua IP dalam file teks (linux)

0

Saya sedang menulis sebuah skrip untuk mencari ping dari IP asing asing, tetapi saya mengalami kesulitan memahami cara memformat perintah "grep" saya .. Di dalam file teks saya adalah output dari perintah "netstat anp". Di windows, saya dapat mencapai ini dengan perintah berikut:

grep -oP (\d{1,3}\.){1,3}\d{1,3} inc.txt  

Output dalam file teks diformat seperti itu:

Active Internet connections (w/o servers)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State        
tcp        0      1 172.18.24.12:51699      72.21.91.17:https       FIN_WAIT1    
tcp        0      1 172.18.24.12:55154      71.19.176.223:https     FIN_WAIT1  
tcp        0      1 172.18.24.12:59926      173.194.46.89:http      FIN_WAIT1  

(Saya berencana memfilter alamat lokal keluar). Tapi sepertinya saya tidak tahu bagaimana saya bisa memformat perintah ini untuk skrip bash saya. Saya kira seseorang di sini tidak bisa membantu saya dengan ini? Bantuan selalu dihargai.

pengguna7980
sumber
Bisakah Anda menempelkan contoh output netstatdalam pertanyaan Anda? Ada banyak opsi berbeda dan jauh lebih mudah jika kami tahu apa yang Anda lihat.
mtak
Ya (maaf) saya telah memperbarui op.
user7980
mungkin sesuatu seperti ini berfungsi -> grep inc.txt -e ". * (\ d {1,3} \.) {3} (\ d {1,3}). *"
konqui
perl mungkin memiliki alat yang mungkin memiliki hal regex yang lebih baru daripada grep, yang mungkin mendukung rentang angka yang ditentukan.
barlop
-1 Anda seharusnya telah menunjukkan kesalahan yang Anda dapatkan .. Dan jika Anda melakukan bahkan pemecahan masalah dasar, Anda akan melihat bahwa bahkan contoh sederhana seperti $ echo 3.4.5.6 | grep -oP (\d{1,3}\.){1,3}\d{1,3} gagal bahkan tanpa semua output nestat. Anda seharusnya memposting kesalahan, misalnya bash: syntax error near unexpected token ('' Dan Anda seharusnya menyatakan bahwa Anda baik-baik saja dengan regex itu secara logis. Dan karena Anda mendapatkan kesalahan sintaks (yang tidak Anda nyatakan), Anda harus mencoba regex yang lebih sederhana seperti `$ echo 123 | grep -oP (\ d)` `dan melihat kesalahan yang sama. Anda tidak menunjukkan upaya pemecahan masalah.
barlop

Jawaban:

0

Mengutip regex sepertinya bekerja untuk saya:

grep -oP '(\d{1,3}\.){1,3}\d{1,3}' inc.txt

Edit oleh barlop-

Atau seperti yang diberikan Scott, sedikit lebih spesifik '(\d{1,3}\.){3}\d{1,3}' jika Anda ingin membuatnya jadi tepatnya 4 oktet tidak lebih tidak kurang.

astaga
sumber
1
@ user7980, BTW regex Anda agak longgar. Itu juga akan cocok 172.18atau 172.18.24. Anda mungkin bisa menggunakannya (\d{1,3}\.){4}\d{1,3}untuk membuatnya sedikit lebih ketat.
heavyd
1
@heavyd: (1) Dengan beberapa interpretasi , "172.18" dan "172.18.24" adalah alamat IPv4 yang valid - tetapi demikian pula "0x7F.0.0.1", "10.16777215", dan "2130706433", sehingga tidak membuat banyak akal untuk mencoba mencari mereka dengan regex. Mengingat itu, (2) saya percaya maksud Anda (\d{1,3}\.){3}\d{1,3}.
Scott
Dia berkata, "Saya berencana menyaring alamat lokal)" Anda seharusnya menyebutkan itu, misalnya menunjukkan bahwa alamat Anda tidak akan. Dan karena garis Anda mirip dengan garisnya, Anda harus menunjukkan perbedaan antara garis Anda dan grep -oP (\d{1,3}\.){1,3}\d{1,3} inc.txt
garisnya
@barlop, saya menunjukkan perbedaannya. Satu-satunya perbedaan adalah saya menambahkan tanda kutip ke baris perintah. Dan, saya mungkin telah menafsirkan apa yang dia katakan salah, tetapi saya mengambilnya ketika saya berencana untuk menyaring alamat lokal, karena dia sudah mengurus persyaratan itu di bagian lain dari skripnya (saya mungkin salah). Dalam kedua kasus, saya tidak berpikir itu membuat jawaban tidak berguna, terutama karena OP menandainya menjawab pertanyaannya.
heavyd
ya jawaban Anda baik-baik saja..Saya kira interpretasi Anda benar rentang nomor kembali, itu adalah pertanyaan yang sangat buruk
barlop
0

Metode penemuan berturut-turut yang bekerja dari skrip atau dari shell adalah ini:

Sebagai contoh misalkan kita mencari 72.21.95.46

grep ' 72\.' netstat.txt will give you all the ip addresses that start with 72.

Anda kemudian dapat memfilter output tersebut dengan greps berikutnya untuk membatasi IP ke keluarga atau IP unik:

dari shell Anda dapat menggunakan "ulangi perintah sebelumnya dengan bang bang":

!! | grep 21\.

dari naskah

grep ' 72\.' | grep 21\. 

dan seterusnya.

Untuk mendapatkannya dalam satu kesempatan, katakan saja

grep 72.21.95.46 netstat.txt

titik-titik akan diperluas ke karakter tunggal apa pun

jika Anda terbang menggunakan pesawat ulang-alik:

grep '72\.21\.95\.46' netstat.txt
vwvan
sumber