Kabuk komut dosyası kullanarak bir dosyada IP adresinin olup olmadığını nasıl kontrol edebilirim?


14

Bazı çıktı üreten bir komut dosyası var. Bu çıkışı aşağıdaki gibi herhangi bir IP adresi için kontrol etmek istiyorum

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

fgrepiyi bir fikir?

Bash'ım var.


İstediğiniz gibi grep, egrep, awk veya sed kullanın
Ijaz Ahmad Khan

Sözdizimine yardımcı olabilir misiniz lütfen? Yani rastgele bir IP'yi nasıl arar? Deseni nasıl tarif edebilirim? Belirli bir adresi değil, herhangi bir IP adresini arıyordum.
Koshur

5
Dört ondalık gösterimde yalnızca IPv4 adresleri mi? Onlar gibi yazılabilir 0010.0000.0000.0001mi? Dosya başka türlü sürüm numaraları ( soft-1.2.1100.1.tar.gz, ağ özellikleri (10.0.0.0/24), 1.2.3.4.5) gibi IP adreslerine benzeyen şeyler içerebilir mi? 333.444.555.666 üzerinde olumlu bir çözümü kabul eder misiniz? Veya 0377.0377.0377.0377(geçerli bir dörtlü sekizli IP adresi)?
Stéphane Chazelas

Varsa bash, awkgenellikle de aynıdır, bu yüzden bu sizin için işe yarayabilir: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(Bu tek astar, ana XFR listesinin çıktısını /etc/hostsformata çevirir .)
Mark Hudson

Yanıtlar:


27

Evet, Kullanacağınız birçok seçenek / araç var. Sadece denedim, işe yarıyor:

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

böylece grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"ip adreslerini çıktınızdan grep yapabilirsiniz .


Teşekkürler. Bu çalışıyor. Biraz açıklayabilir misin? Bu düzenli bir ifade mi?
Koshur

Evet bu, grep ile bash'da kullanılan normal bir ifadedir, noktalarla ayrılmış üç basamaklı desen arıyorsunuz. art arda 2 basamak için {1,2} içindeki sayıları değiştirerek oynayabilirsiniz
Ijaz Ahmad Khan

Biri "\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"CIDR'leri bulmak için de kullanılabilir (geçerli oldukları varsayılarak)
vikas027

2

cevabımı şu cevaba dayanarak başlatmak:

Evet, Kullanacağınız birçok seçenek / araç var. Sadece denedim, işe yarıyor:

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b" a böylece grep -oE'yi kullanabilirsiniz "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b "çıkışınızdan ip adreslerini grep.

ve cevabı tam uzunlukta IPv6'ya dönüştürme vb.:

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

/ nnn varsa orada tutmak istiyorsanız:

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

ayrıca IPv6'nın '::' içeren kısaltılmış sürümü de var.

daha fazla IPv6 cevabı için buraya bakabilirsiniz: /programming/53497/regular-expression-that-matches-valid-ipv6-addresses


fgrepgrepmodel eşleşmesini yok sayan bir varyantın eski adıdır . Bunun yerine, özellikle de desen eşleşmesini açıkça istediğiniz için grep(veya hatta egrep) kullanmanızı öneririm .
roaima

2

Dosyanız çağrılırsa örneğin ipsşöyle bir şey yazabilirsiniz:

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

Daha sonra komut dosyasını takip ederek parametreleri iletebilirsiniz

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

1

SmartOS'ta (Solaris'in bir çeşidi) test edilmiştir , umarım diğer * nix ortamlarında çalışmalıdır:

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

Misal:

$ 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

Bu model sadece maçları geçerli yani IPv4, 0-255 arasında değişmektedir. Yalnızca eşleşen IP'yi çıkarmanız gerekirse , yukarıdaki komuta bir seçenek ekleyin . Bu komutu bir bash komut dosyasına ve muhtemelen diğer kabuk komut dosyalarına da yerleştirebilirsiniz. Ve başarısız olursa,x.x.x.xx-oegreptry grep -E ...

Bir (bash) kabuk betiğinde kullanma:

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


Bu bir CentOS 6 sisteminde iyi çalıştı, grep 2.6.3
David Ramirez

0

Dosyada IP listesi varsa, her satıra bir tane grepgelecek şekilde , zaten uygun olan -fseçeneğe sahiptir:

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

Bu, isteğe bağlı olarak farklı bir IP yapmak için isteğe bağlı olarak başka bir sayı izleyen dizelerden dolayı birkaç yanlış pozitifliğe neden olabilir. Bu konuda yapabileceğiniz birçok şey, durumunuza bağlı olarak endişelenmeye karar verebilir veya vermeyebilirsiniz.


0

Başka bir gönderiye cevabımın burada daha uygun olduğunu düşünüyorum. Bu yazı ve benzeri diğerleri sayesinde, doğru IP formatını arayan, daha sonra 256 veya daha yüksek içeren tüm satırlardan kurtuldum. IP'yi, bunun yerine çıktı görmemek için geçerli olmayan bir şeyle değiştirin:

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

İlk grep muhtemelen bu yazıda bulundu ve XXXX biçiminde 0-999 arasındaki sayıları kontrol ediyor

İkinci grep 256-999 numaralı satırları kaldırır, böylece sadece geçerli biçim IP'lerini bırakır, bu yüzden düşündüm

AMA ... G-Man'ın işaret ettiği gibi, IP'nin kendi hattında olacağını varsayarak hata yaptım. Çoğu zaman olsa da, IP'nin her iki tarafında aranacak bir boşluk veya başka bir bölücü olacaktır. Boşluklar / bölücüler IP bulunduktan sonra sed veya başka yollarla çıkarılabilir. Ayrıca ilk grep'e -o ekledim:

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

Birincisi ve ikincisi çıktı vermez, üçüncüsü yapar ve boşluklar çıkarılır.


10.0.0.1 ile 10.0.1.244 arasında değişen 500 adresim olduğunu varsayalım. Kişisel ikinci grepnedeni “500” satırını dışarı atmak olacaktır. (Soru, dosyadaki IP adreslerinin, eğer varsa, kendi başlarına bir satırda olacağını asla söylememiştir.) Diğer yandan, 1234.1.1.1 ve 1.1.1.1234'ü kabul edecektir. Ama bunun dışında, fena değil.
G-Man

-1

Bu çıktıyı bazılarına yönlendir outputFile

Sadece grepdesenle,

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

4
Bunun .normal bir ifade operatörü olduğunu ve kelimenin tam anlamıyla tedavi edilmesi için kaçması gerektiğini unutmayın
Stéphane Chazelas

1
Bunlar kalıp değil, değişmez. OP "herhangi bir IP" belirttiği için yararlı bir cevap değil.
Mark Hudson

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.