आईपी ​​पते से मिलान करने के लिए मैं किस नियमित अभिव्यक्ति का उपयोग कर सकता हूं?


35

निम्नलिखित grepसिंटैक्स के साथ मैं एक फ़ाइल में ( kshस्क्रिप्ट से) सभी आईपी पते का मिलान करना चाहता हूं

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

समस्या: यह उन शब्दों (आईपी) से भी मेल खाती है जिनमें अधिक 4 ओकटेट हैं:

1.1.1.1.1 

या

192.1.1.1.160

मैं एक वैध आईपी ​​और केवल 4 ओकटेट्स के साथ आईपी पते का मिलान कैसे कर सकता हूं ? मैं पर्ल का उपयोग भी कर सकता हूं - एक पंक्ति सिंटैक्स समाधान, अगर grepयह काम नहीं करता है।


4
इसका 999.999.999.999भी मिलान होगा ।
साइरस

4
तो, आप केवल IPv4 पतों को प्राप्त करना चाहते हैं, है ना?
अर्जन

5
तकनीकी रूप से, आईपी पते जैसे कि 192.1.4097लिनक्स ग्लिबक और विंडोज द्वारा मान्य और स्वीकार किए जाते हैं।
grawity

1
आह, मैं कभी नहीं जानता था ! ping 2130706433, ओएस एक्स पर PING 2130706433 (127.0.0.1): 56 data bytes:।
अर्जन

1
@Arjan: 0x7f.1और0177.1
grawity

जवाबों:


56

इसे इस्तेमाल करे:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

जो सभी भावों से मेल खाता 0.0.0.0है999.999.999.999

साथ में

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

आपको आईपी पते ही मिलेंगे

नोट:
Solaris पर शायद egrep काम करेगा।


मैं grep '\ b \ d {1,3} \ _। \ D {1,3} \ _। D \ _ {3} \ _ \ _ \ _ {1,3} \ b' / etc / host / कोशिश करता हूं, लेकिन मैं कुछ भी नहीं मिलता है: --(
जेनिफर 13

1
@ जेनिफर, आपको विस्तारित नियमित अभिव्यक्तियों को सक्षम करने की आवश्यकता होगी: grep -E <pattern> <file>(या, केवल मैचों को प्रिंट करने के लिए:grep -Eo <pattern> <file>
अर्जन

इस तरह ? grep -E '\ b \ d {1,3} \ _ \ d {1,3} \ _। d d {3/3} \ _ \ _ {1,3} \ b' / etc / मेजबान
jennifer

3
@ न्यूड: वैसे तो यह मेल खाता है 1.1.1.1.1लेकिन यह .1आउटपुट से आखिरी को छुपाता है , मैं यह नहीं देख सकता कि यह कैसे मदद कर सकता है।
cyrus

1
आपका regexp 10.0.0.1 से मेल नहीं खाता है
स्टीफन सेडेल

10

यह कैसा है:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts

अच्छा! (यह भी , 192.1.1.1.160जैसा 192.1.1.1कि मुझे लगता है कि प्रश्न पूछने वाले के लिए ठीक है।)
अरजन

2
यदि अनुरूप आईपी पते वास्तव में वांछित हैं, तो यह एकमात्र प्रकार का समाधान है जिसमें पूर्ण होने के करीब होने का कोई भी मौका है। जब मैंने सवाल देखा, तो मैंने सोचा कि "मैं दस फुट के मानक regexp पोल के साथ स्पर्श नहीं करूंगा"। कैविट्स, कैविट्स हर जगह :-)।
डैनियल एंडर्सन

5

-w / --word-regexp 

ध्वज grepकेवल शब्द सीमाओं पर मेल खाता है, जिसका अर्थ है कि आपका मैच या तो व्हाट्सएप से घिरा होना चाहिए या लाइन के आरंभ / अंत में शुरू होना चाहिए!


5

केवल 4 ऑक्टेट के साथ मिलान खोजने के लिए (1.1.1.1.1 जैसी चीजों को छोड़कर) इसका उपयोग करें:

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'

इसे कभी भी गैर-आईपी-पते का पता नहीं लगाना चाहिए। अधिक चीजों को सत्यापित करने के लिए अभिव्यक्ति अधिक जटिल हो सकती है लेकिन ज्यादातर मामलों के लिए यह काम करना चाहिए। यह पूर्ववर्ती 0 से मेल नहीं खाएगा क्योंकि 010.1.12.1 आईपी पते लिखने के लिए एक सामान्य तरीका नहीं है।


5
if [ ` echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'  | grep -o "\." | wc -l` -eq 1 ];
then ipv4=true;
else 
ipv4=false;

3

थोड़ा मुश्किल है, लेकिन यह काम करना चाहिए:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )

127.000.000.001फिर किस बारे में ? ;-)
अर्जन

जहाँ तक मुझे पता है कि IP में पैडिंग ज़ीरो नहीं है।
cYrus

1
हम्म, ping 127.000.000.001निश्चित रूप से मेरे मैक पर काम करता है। लेकिन फिर: मैंने अभी-अभी सीखा है कि ping 2130706433बहुत ही परिणाम मिलता है। :-) उफ़, ping 00127.00000.00000.00001अनुवाद करता है 87.0.0.1। अजीब ... या ऑक्टल शायद? हां, सुनिश्चित करने के लिए अष्टक, इसलिए आप मेरे द्वारा अनुमान लगाए जाने वाले अग्रणी शून्य के बारे में सही हैं।
अर्जन

हां, 00127 (अष्टक) = 87 (दशमलव)। निश्चित रूप से वे सभी मान्य आईपी हैं, लेकिन मुझे लगता है कि उनका प्रतिनिधित्व करने का मानक तरीका नहीं है। वैसे भी यह पूछने वाले द्वारा अनुरोध नहीं किया गया है।
cyrus

0

grep -E '^ ((25 [0-5] | 2 [0-4] [0-9] | [1]; [1-9] [0-9]?)) {3} (25) 0-5] | 2 [0-4] [0-9] |? [1] [1-9] [0-9]) $ '

अरनौद बी के उत्तर का संशोधित संस्करण।

यह अभिव्यक्ति अग्रणी 0 के साथ IP पते से मेल नहीं खाएगी। उदाहरण के लिए, यह 192.168.1.01 से मेल नहीं खाएगा। यह अभिव्यक्ति 4 से अधिक ओकटेट्स के साथ आईपी पते से मेल नहीं खाएगी। उदाहरण के लिए, यह 192.168.1.2.3 से मेल नहीं खाएगा


यह या तो 127.0.0.1 से मेल नहीं खाएगा।
क्रिस चारबारुक

0

मैं egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts एक पंक्ति की शुरुआत में आईपी एड्रेस से मिलान करने के लिए उपयोग कर रहा हूं । इसका उपयोग ^आईपी ​​पते से पहले सफेद रिक्त स्थान या अन्य वर्णों की अनुमति के बिना भी किया जा सकता है ।

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.

0

लंबे रेगेक्स का एक छोटा संस्करण:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}' 

कृपया अपने OS संस्करण के लिए grep -E या egrep का उपयोग करें


2
सुपरस्टार में आपका स्वागत है। इस सवाल के पहले से ही कई अच्छे जवाब हैं। उन लोगों के बीच मतभेदों को समझने में मदद करने के लिए, कृपया अपना उत्तर संपादित करें और समझाएं कि यह क्या बेहतर बनाता है / अन्य लोगों से अलग।
मेत जुहेसज

यह अभिव्यक्ति 8.8.8.8 echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=> परिणाम के रूप में इस तरह के कानूनी ips को ध्यान में नहीं
रखती है


0

टीसीएल में एक आईपी पते के मिलान के लिए नियमित अभिव्यक्ति

"192.168.10.25" सेट करें

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
    puts "yes"
}

-1

यहाँ AIX में ksh और ksh93 के लिए मेरे लिए क्या काम किया गया है:

आईपी ​​=

[[$ ip == [0-9] @ ("| [0-9]) @ (" "| [0-9])। [0-9] @ (" "| [0-9]) @ ( "" | [0-9]) [0-9] @। ( "" | [0-9]) @ ( "" | [0-9])। [0-9] @ ( "" | [0-9]) @ ("" | [0-9])]] && इको ओके || echo NOK उपरोक्त को संशोधित किया जा सकता है ताकि जो भी पैटर्न वांछित है, उसे प्रदान किया गया आईपी "फ़िल्टर" कर सके।

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