นิพจน์ปกติเพื่อค้นหา IP ของผู้ส่งโดยใช้ grep หรือภาษาอื่น


0

ฉันมีไฟล์อินพุตที่มี:

19:04:01.631948 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:02.061482 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72      addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:03.583896 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72  addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:04.005483 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:05.511947 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:05.997361 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:07.427876 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:07.925385 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:09.403864 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:09.845241 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72   addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:10.877531 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto IGMP (2), length 28)

และฉันต้องการผลลัพธ์เป็นเช่นนี้

181.173.82.61
and other ips
(just senders IP (left IP))

ฉันลองนิพจน์ทั่วไปต่อไปนี้เป็น grep:

grep -E -o '[1-9][0-9][0-9]?\.[1-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.\s\>

เพื่อแก้ปัญหานี้ฉันลองตรวจสอบ IP ที่มีรูปแบบนี้:

(ip)(port)(space)(>)

จากนั้นระงับและลบแท็ก & gt; และหมายเลขพอร์ต แต่ปริมาณการแสดงออกปกติของฉันไม่ทำงาน
ฉันจะขอบคุณวิธีอื่น ๆ เช่น awk หรือสำนวนปกติที่ดีกว่า

คำตอบ:


1

หากสิ่งที่คุณต้องการคือ IP แรกของแต่ละบรรทัดคุณสามารถทำได้:

grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4

ส่งออกไฟล์ตัวอย่างของคุณ:

181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60

คำอธิบาย:

  • grep '>' file.txt : พิมพ์เฉพาะบรรทัดที่มีอักขระ >. ในไฟล์ที่คุณโพสต์สิ่งเหล่านี้คือบรรทัดที่ขึ้นต้นด้วย IP

    grep '>' file.txt | head -1
    181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
    
  • gawk '{print $1}' : พิมพ์ฟิลด์แรกของแต่ละบรรทัด

      grep '>' file.txt | gawk '{print $1}' | head -1
      181.173.82.61.1985
    
  • cut -d "." -f -4 : ใช้ . เป็นตัวคั่นฟิลด์และพิมพ์ทุกอย่างจนถึงฟิลด์ที่ 4 สิ่งนี้จะลบตัวเลขพิเศษจาก IP

    grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4 | head -1
    181.173.82.61
    

1

ตอนนี้นิพจน์ปกติของคุณกำลังมองหา IP ในรูปแบบเท่านั้น xxx.xxx.xxx.xxxแต่ IP สามารถเป็นได้ x.x.x.x และอะไรก็ตามที่เหมือนกัน xxx.xxx.x.xx (และในตัวอย่างของคุณ: xxx.xxx.xx.xx สำหรับส่วน IP)

ดังนั้นหมายความว่าการแสดงออกปกติของคุณต้องมีลักษณะเหมือน:

'[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,4} >'

นั่นบอกว่า "ฉันต้องการ 1-9 ที่ใดก็ได้จาก 1 ถึง 3 ในแถวตามด้วย '.' แล้ว 0-9 ที่ใดก็ได้จาก 1-3 ในแถว" และอื่น ๆ ทำงานได้โดยไม่ต้อง ?, FWIW

เนื่องจากคุณกำลังพูดอย่างชัดเจนว่า "ช่องว่างและ & gt;" คุณไม่จำเป็นต้องแฟนซีมากเกินไป


ฉันไม่เห็นด้วยกับคุณได้รับ ips (ทดสอบว่า ive) และ tnx สำหรับความช่วยเหลือของคุณ
Arash

และนิพจน์ทั่วไปของคุณคืนค่า 173.82.61.1985 แทน 181.173.82.61.1985 และไม่ใช่ที่อยู่ IP ที่ถูกต้อง
Arash

1

ฉันค่อนข้างมั่นใจว่ามันสามารถทำได้ดีกว่านี้ แต่ถ้าฉันคัดลอกตัวอย่างของคุณไปที่ testfile และลบมาร์กอัป (ช่องว่างพิเศษ 4 ตอนเริ่มต้น) การทำงานนี้:

>cat testfile | grep -E "[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[1-9]{1,3}" | cut -d. -f1-4

เอาต์พุตของตัวกรอง grep ลงไปที่:

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72      addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72  addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"

บาดแผลถูกใช้เพื่อคว้าเฉพาะสี่ฟิลด์แรกเท่านั้น ( -f สำหรับฟิลด์ 1-4 สำหรับ 1,2,3,4) โดยใช้จุดเป็น -d กำจัด)


tnx แต่ให้ผลลัพธ์ที่ไม่ถูกต้องเช่น: 181.173.82.60 181.173.82.61 181.173.82.60 181.173.82.61 & gt; 229 181.173.83.239 & gt; 245 181.173.82.61 181.173.82.60 172.30.79.250 & gt; 247 181.173.82.61 181.173.82.60 181.173.82.47 & gt; 245 172.19.11.163 & gt; 253 181.173.82.61 & gt; 239`
Arash

181.173.82.61 & gt; 229 หมายความว่าฉันแค่ต้องการ IP ไม่ & gt; 229 แต่รหัสของคุณมีข้อผิดพลาดเล็กน้อยและนี่ก็ดี :)
Arash

1

ใช้ไฟล์ตัวอย่างและ regex ของฉันฉันมาถึงวิธีแก้ปัญหาที่ง่ายกว่านี้:

perl -ne 'print "$1\n" if /^(.*)\.\d+ >/' test.txt

มันพิมพ์ทุกนัดก่อน " หมายเลขพอร์ต & gt;"


0

ฉันค่อนข้างแปลกใจที่ไม่มีใครโพสต์สิ่งนี้ง่ายมาก grep สารละลาย. ฉันคัดลอกและวางข้อความตัวอย่างของคุณลงในไฟล์ข้อความที่เรียกว่า "ips.txt" และรันคำสั่งต่อไปนี้:

grep -Eo "^([0-9]{1,3}\.){3}[^. ]*" ips.txt

ผลลัพธ์ที่ฉันได้รับคือ:

181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60

และถ้าคุณต้องการที่จะเห็น IP_ADDR ทั้งหมดในไฟล์เพียงแค่ละเว้น ^ ที่จุดเริ่มต้นของ regex ของคำสั่ง grep มันจะแสดง IP ทั้งหมดในรายการเพื่อให้คุณสามารถกรองผ่านได้ตามต้องการ

enter image description here

ซึ่งเกิดขึ้นจะเป็นผลลัพธ์ที่แน่นอนเช่นเดียวกับคำตอบที่ยอมรับเท่านั้นโดยไม่ต้องใช้ท่อจำนวนมาก ตราบใดที่ไฟล์ของคุณจำเป็นต้องมีการวิเคราะห์คำมีผู้ส่ง IP_ADDR ที่จุดเริ่มต้นของบรรทัดคำสั่งนี้จะทำสิ่งที่คุณต้องการ

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