จะตรวจสอบว่าที่อยู่ IP ใด ๆ อยู่ในไฟล์โดยใช้เชลล์สคริปต์ได้หรือไม่


14

ฉันมีสคริปต์ที่สร้างผลลัพธ์บางอย่าง ฉันต้องการตรวจสอบผลลัพธ์สำหรับที่อยู่ IP ใด ๆ ที่ต้องการ

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 อะไรก็ได้ที่คุณต้องการ
Ijaz Ahmad Khan

คุณช่วยไวยากรณ์ด้วยได้มั้ย ฉันหมายถึงมันค้นหา IP แบบสุ่มได้อย่างไร วิธีการอธิบายรูปแบบ? ฉันจะมองหาที่อยู่ IP ใด ๆ ไม่ใช่ที่อยู่เฉพาะ
Koshur

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(ที่อยู่ IP quad-octal ที่ถูกต้อง)?
Stéphane Chazelas

ถ้าbashมีอยู่ก็awkมักจะเป็นเช่นนั้นดังนั้นสิ่งนี้อาจใช้ได้กับคุณ: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(ซับไลน์หนึ่งแปลเอาต์พุตของรายการโฮสต์ XFR เป็น/etc/hostsรูปแบบ)
Mark Hudson

คำตอบ:


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 ที่อยู่ IP จากผลลัพธ์ของคุณ


ขอบคุณ วิธีนี้ใช้ได้ผล คุณช่วยอธิบายหน่อยได้ไหม? นี่เป็นนิพจน์ปกติหรือไม่
Koshur

ใช่นี่เป็นนิพจน์ทั่วไปที่ใช้ใน bash กับ grep คุณแค่มองหารูปแบบตัวเลขสามหลักคั่นด้วยจุด คุณสามารถเล่นโดยการเปลี่ยนตัวเลขใน {1,2} เป็นตัวเลข 2 หลักติดต่อกันและอื่น ๆ
Ijaz Ahmad Khan

ท่านสามารถใช้"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"เพื่อค้นหา CIDRs (สมมติว่าถูกต้อง)
vikas027

2

เริ่มคำตอบของฉันตามคำตอบนี้:

ใช่คุณมีตัวเลือก / เครื่องมือมากมายที่จะใช้ ฉันแค่ลองมันใช้งานได้:

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b" a เพื่อให้คุณสามารถใช้ grep -oE "\ b ([0- 0- 9] {1,3}.) {3} [0-9] {1,3} \ b "เพื่อ grep ที่อยู่ IP จากเอาต์พุตของคุณ

และแปลงคำตอบให้เต็มความยาว 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/regular-expression-that-matches-valid-ipv6-addresses


fgrepเป็นชื่อเก่าสำหรับชุดอักขระgrepที่ละเว้นการจับคู่รูปแบบ ฉันขอแนะนำให้คุณใช้grep(หรือแม้กระทั่งegrep) แทนโดยเฉพาะอย่างยิ่งเมื่อคุณต้องการจับคู่รูปแบบที่ชัดเจน
roaima

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

ทดสอบในSmartOS (ตัวแปรของ Solaris) หวังว่าควรทำงานในสภาพแวดล้อม * nix อื่น ๆ :

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ที่xช่วง 0-255 หากคุณต้องการแยกเฉพาะ IP ที่ตรงกันให้เพิ่ม-oตัวเลือกในคำสั่งด้านบน คุณสามารถฝังคำสั่งนี้ในสคริปต์ทุบตีและสันนิษฐานว่าในเชลล์สคริปต์อื่น ๆ เช่นกัน และถ้าegrepล้มเหลวtry grep -E ...

ใช้ในเชลล์สคริปต์ (ทุบตี):

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
David Ramirez

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

สิ่งนี้อาจทำให้เกิดผลบวกปลอมสองสามอันเนื่องจากสตริงที่เลือกตามด้วยหมายเลขอื่นเพื่อให้เป็น IP อื่น มีหลายสิ่งที่คุณสามารถทำได้เกี่ยวกับเรื่องนี้ขึ้นอยู่กับกรณีของคุณคุณอาจจะหรือไม่ตัดสินใจที่จะกังวล


0

ฉันคิดว่าคำตอบของฉันสำหรับการโพสต์อื่นเหมาะกว่าที่นี่ ขอบคุณโพสต์นี้และอื่น ๆ เช่นฉันฉันมากับนี้ที่มองหารูปแบบ IP ที่ถูกต้องแล้วกำจัดทุกบรรทัดที่มี 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 แรกในโพสต์นี้และตรวจสอบหมายเลขใด ๆ จาก 0-999 ในรูปแบบ XXXX

grep ตัวที่สองลบบรรทัดที่มีหมายเลข 256-999 ดังนั้นเหลือเฉพาะรูปแบบ IP ที่ถูกต้องเท่านั้นดังนั้นฉันคิดว่า

แต่ ... ตามที่ G-Man ชี้ให้เห็นว่าฉันมีข้อผิดพลาดโดยสมมติว่า IP จะอยู่ในสายของตัวเอง ส่วนใหญ่มักจะมีช่องว่างหรือตัวแบ่งอื่นเพื่อค้นหาทั้งสองด้านของ IP ช่องว่าง / ตัวหารสามารถลบออกด้วย sed หรือวิธีอื่น ๆ หลังจากที่พบ IP ฉันยังเพิ่ม -o ใน grep แรก:

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" (คำถามไม่เคยบอกว่าที่อยู่ IP ในไฟล์ถ้ามีจะอยู่ในบรรทัดด้วยตัวเอง) ในทางกลับกันก็จะยอมรับ 1234.1.1.1 และ 1.1.1.1234 แต่นอกเหนือจากนั้นก็ไม่เลว
G-Man กล่าวว่า 'Reinstate Monica'

-1

เปลี่ยนเส้นทางเอาต์พุตไปที่บางอัน outputFile

เพียงแค่grepมีรูปแบบเป็น

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

4
โปรดทราบว่า.ตัวดำเนินการนิพจน์ทั่วไปและจำเป็นต้องหลบหนีเพื่อให้ได้รับการปฏิบัติอย่างแท้จริง
Stéphane Chazelas

1
นั่นไม่ใช่รูปแบบ แต่เป็นตัวอักษร ไม่ใช่คำตอบที่มีประโยชน์เนื่องจาก OP ระบุ "IP ใด ๆ "
Mark Hudson

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.