शेल स्क्रिप्टिंग का उपयोग करके किसी भी आईपी पते को फाइल में मौजूद है या नहीं, इसकी जांच कैसे करें?


14

मेरे पास एक स्क्रिप्ट है जो कुछ आउटपुट उत्पन्न करती है। मैं किसी भी आईपी पते की तरह उस आउटपुट को जांचना चाहता हूं

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

है fgrepएक अच्छा विचार है?

मेरे पास बैश उपलब्ध है।


grep, egrep, awk, या sed का उपयोग करें, जो कुछ भी आपको पसंद है
Iazaz Ahmad Khan

क्या आप वाक्य रचना कृपया मदद कर सकते हैं? मेरा मतलब है कि यह एक यादृच्छिक आईपी के लिए कैसे खोज करता है। पैटर्न का वर्णन कैसे करें? मैं किसी भी आईपी पते की तलाश करूंगा, किसी विशेष पते की नहीं।
कोशुर

5
क्या यह केवल IPv4 क्वाड-दशमलव संकेतन में पता है? क्या उन्हें लिखा जा सकता है 0010.0000.0000.0001? फ़ाइल में अन्यथा ऐसी चीज़ें हो सकती हैं जो IP पते की तरह दिखती हैं जैसे संस्करण संख्याएँ ( soft-1.2.1100.1.tar.gz, नेटवर्क विनिर्देश (10.0.0.0/24), 1.2.3.4.5)? क्या आप कोई ऐसा समाधान स्वीकार करेंगे जो 333.444.555.666 पर सकारात्मक हो? या 0377.0377.0377.0377(एक वैध क्वाड-ऑक्टल आईपी पता)?
स्टीफन चेजालस

यदि bashउपलब्ध है, तो awkआमतौर पर यह भी है, इसलिए यह आपके लिए काम कर सकता है: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(यह एक-लाइनर मेजबान XFR सूची के आउटपुट को /etc/hostsप्रारूपित करने के लिए अनुवाद करता है।)
मार्क हडसन

जवाबों:


27

हां, आपके पास उपयोग करने के लिए बहुत सारे विकल्प / उपकरण हैं। मैंने अभी यह कोशिश की, यह काम करता है:

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

तो आप grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"अपने आउटपुट से आईपी पते को प्राप्त करने के लिए उपयोग कर सकते हैं ।


धन्यवाद। यह काम। क्या आप थोड़ा समझा सकते हैं? क्या यह एक नियमित अभिव्यक्ति है?
कोषूर

हाँ यह एक नियमित अभिव्यक्ति है जिसका उपयोग grep के साथ बश में किया जाता है, आप बस डॉट्स द्वारा अलग किए गए तीन अंकों के पैटर्न की तलाश कर रहे हैं। आप लगातार 2 अंकों के लिए {1,2} में संख्याओं को बदलकर खेल सकते हैं
इज़ाज़ अहमद खान

"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"CIDR को खोजने के लिए एक का उपयोग किया जा सकता है (वे मान्य हैं)
vikas027

2

इस जवाब के आधार पर अपना जवाब शुरू करना:

हां, आपके पास उपयोग करने के लिए बहुत सारे विकल्प / उपकरण हैं। मैंने अभी यह कोशिश की, यह काम करता है:

ifconfig | grep -oE "\ b ([0-9] {1,3}।} {3} [0-9] {1,3} \ b" इसलिए आप grep -oE "\ b ([0-] का उपयोग कर सकते हैं 9] {1,3}।) {3} [0-9] {1,3} \ b "अपने आउटपुट से आईपी पते को प्राप्त करने के लिए।

और पूर्ण लंबाई वाले IPv6, आदि का उत्तर परिवर्तित करना ...:

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

यदि आप / nnn रखना चाहते हैं तो यह है:

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

और IPv6 का छोटा संस्करण भी है जिसमें '::' शामिल है।

अधिक IPv6 उत्तरों के लिए आप यहां देख सकते हैं: /programming/53497/ अनियमित-expression-that-matches-valid-ipv6-addresses


fgrepgrepउस मिलान पैटर्न के एक संस्करण का पुराना नाम है जो मेल खाता है। मैं आपको इसके बजाय grep(या यहां तक ​​कि egrep) का उपयोग करने की सलाह दूंगा, खासकर जब आप स्पष्ट रूप से पैटर्न मिलान चाहते हैं
रोइमा

2

यदि आपकी फ़ाइल को कॉल किया जाता है, ipsतो आप कुछ इस तरह लिख सकते हैं:

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

फिर आप स्क्रिप्ट का पालन करते हुए पैरामीटर पास कर सकते हैं

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

1

स्मार्टओएस (सोलारिस का एक प्रकार) में परीक्षण किया गया , उम्मीद है कि अन्य * निक्स वातावरण में काम करना चाहिए:

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

उदाहरण:

$ 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

यह पैटर्न केवल मान्य IPv4 से मेल खाता है , अर्थात, x.x.x.xजहाँ x0-255 तक है। क्या आपको केवल मिलान किए गए आईपी को निकालने की आवश्यकता है, -oउपरोक्त कमांड में एक विकल्प जोड़ें । आप इस कमांड को बैश स्क्रिप्ट में और संभवतः अन्य शेल स्क्रिप्ट में भी एम्बेड कर सकते हैं। और, यदि egrepविफल रहता है,try grep -E ...

इसे (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


इसने CentOS 6 सिस्टम, grep 2.6.3
डेविड रामिरेज़

0

यदि आपके पास फ़ाइल में IP की सूची है, तो प्रति पंक्ति, grepपहले से ही सुविधाजनक -fविकल्प है:

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

वैकल्पिक रूप से इसे एक अलग आईपी बनाने के लिए दूसरे नंबर के बाद स्ट्रिंग के कारण कुछ गलत सकारात्मकता हो सकती है। इसके बारे में बहुत सारी बातें जो आप कर सकते हैं, आपके मामले पर निर्भर करता है कि आप चिंता करने का फैसला कर सकते हैं या नहीं।


0

मुझे लगता है कि किसी अन्य पोस्ट के लिए मेरा उत्तर यहां बेहतर अनुकूल है। इस पोस्ट और इसके जैसे अन्य लोगों के लिए धन्यवाद, मैं इस के साथ आया, जो सही आईपी प्रारूप की तलाश करता है, फिर उन सभी लाइनों से छुटकारा पाता है जिनमें 256 या उच्चतर होते हैं। IP को किसी ऐसी चीज़ से बदलें, जिसके बदले कोई आउटपुट न होना मान्य हो:

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 पाया गया था और यह XXXX प्रारूप में 0-999 से किसी भी संख्या के लिए जाँच करता है

दूसरा grep संख्याओं को 256-999 के साथ हटाता है, इस प्रकार केवल मान्य प्रारूप IP को छोड़ता है, इसलिए मैंने सोचा

लेकिन ... जैसा कि जी-मैन ने बताया है, मैं यह मान कर चल रहा था कि आईपी अपनी ही लाइन में होगा। हालांकि हमेशा आईपी के दोनों ओर देखने के लिए एक स्थान या दूसरा डिवाइडर होगा। आईपी ​​मिलने के बाद सीड्स या अन्य साधनों से स्पेस / डिवाइडर को हटाया जा सकता है। मैंने पहले grep में -o भी जोड़ा:

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

पहला और दूसरा कोई आउटपुट नहीं देगा, जबकि तीसरा करता है और रिक्त स्थान छीन लिया जाता है।


मान लीजिए मेरे पास 500 पते हैं, जो 10.0.0.1 से लेकर 10.0.1.244 तक हैं। आपका दूसरा grep"500" के कारण उस पंक्ति को फेंक देगा। (प्रश्न ने यह कभी नहीं कहा कि फ़ाइल में आईपी पता (तों), यदि कोई हो, स्वयं द्वारा एक पंक्ति में होगा।) दूसरी ओर, यह 1234.1.1.1 और 1.1.1.1234 को स्वीकार करेगा। लेकिन उससे अलग, बुरा नहीं है।
जी-मैन का कहना है कि 'मोनिका'

-1

उस आउटपुट को कुछ पर पुनर्निर्देशित करें outputFile

बस grepइसे पैटर्न के साथ,

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

4
ध्यान दें कि .एक नियमित अभिव्यक्ति ऑपरेटर है और इसके लिए वस्तुतः इलाज करने के लिए भागने की जरूरत है
स्टीफन चेज़लस

1
वे पैटर्न नहीं हैं, वे शाब्दिक हैं। ओपी निर्दिष्ट करने के बाद से कोई उपयोगी जवाब नहीं "किसी भी आईपी।"
मार्क हडसन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.