การนับจำนวนครั้งที่แต่ละที่อยู่ IP ปรากฏในล็อกไฟล์


9

ฉันมีไฟล์ในรูปแบบดังต่อไปนี้:

$ cat file.txt

27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1

เป็นวิธีที่ดีที่สุดในการแยกไฟล์file.txtเป็นรูปแบบดังนี้:

27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3

กล่าวอีกนัยหนึ่งฉันต้องการวนรอบไฟล์และนับจำนวนครั้งที่ที่อยู่ IP แต่ละรายการปรากฏขึ้น ฉันได้ลองใช้งานแล้วsortดังนั้นที่อยู่ IP ทั้งหมดจึงเป็นระเบียบและต่อเนื่องกัน


โดยส่วนตัวแล้วฉันจะนำเข้าไฟล์ประเภทนี้ไปยังฐานข้อมูลใกล้เคียงที่มีประโยชน์ (โดยการสร้างตารางชั่วคราวในทุก ๆ โพสต์ของฉันที่มีอยู่) ตามด้วยการดำเนินการ SQL อย่างรวดเร็วและส่งออกกลับไปยังไฟล์ข้อความ
oakad

คำตอบ:


23

คุณกำลังมองหา uniq -c

หากผลลัพธ์ที่ไม่ถูกใจคุณสามารถแยกวิเคราะห์และฟอร์แมตใหม่ได้อย่างง่ายดาย

ตัวอย่างเช่น:

$ uniq -c logfile.txt | awk '{print $2": "$1}'
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3

การรวมกันuniqและawkดูเหมือนจะไม่ใช่วิธีการที่ยอดเยี่ยมสำหรับฉัน ...
Hauke ​​Laging

3
เพราะuniqใช้งานได้กับอินพุตที่เรียงลำดับเท่านั้น (มันตรงกับบรรทัดที่ตรงกันที่อยู่ติดกันไม่ใช่บรรทัดใด ๆ จากไฟล์)
oakad

1
คุณต้องเรียงลำดับผลลัพธ์ก่อนทำการไพพ์ให้เป็น uniq ถ้าคุณอ่าน Q ต้นฉบับ OP ระบุว่าเขาเรียงลำดับผลลัพธ์โดยใช้แล้วsort!
slm

2
@HaukeLaging - ฉันซาบซึ้งกับสิ่งที่คุณพูด แต่ในลักษณะเดียวกับที่ผู้ใช้คอมพิวเตอร์ส่วนใหญ่จะไม่เคยลงทุนนอกเหนือจาก OSX & Windows ผู้ใช้ Unix ส่วนใหญ่จะไม่ใช้เครื่องมือที่กำหนดไว้สำหรับงานเฉพาะ การใช้ AWK นั้นไม่ได้เป็นเพียงเรื่องเล็กน้อยเท่านั้นดูที่สิ่งที่คุณต้องทำเพื่อดำเนินงานพื้นฐานนี้โดยใช้ AWK กับสิ่งที่โซลูชั่นของ Glenn ต้องการ ฉันคิดว่าฉันยุติธรรมในการบอกว่าเขาเป็นทางออกที่ง่ายกว่าที่จะเข้าใจจิตใจแม้ว่าคุณจะมีประสิทธิภาพมากกว่า BTW ฉันทำ UV ทั้งคู่เพราะทั้งคู่ถูกต้อง!
slm

1
@HaukeLaging - ใช่แน่นอน ในขณะที่คุณเข้าไปเยี่ยมชมเว็บไซต์ของเราความรับผิดชอบของเราเปลี่ยนแปลงไปเล็กน้อย IMO เรามีหน้าที่รับผิดชอบในการสร้าง A'ers ที่ครอบคลุมและมองไปที่ A'ers ที่เราจัดเตรียมไว้เพื่อสอนช่วงเวลาให้แก่ OP และผู้เยี่ยมชมในอนาคตทุกคนที่เจอ IMO อีกครั้ง แต่มันก็เป็นทางเลือกส่วนตัวดังนั้นถ้าคุณมีเวลาเพียงไม่กี่นาทีที่จะสำรองไว้การให้ A ในรูปแบบใด ๆ ก็เป็นที่นิยมเสมอ
slm

6

uniqน่าจะเป็นทางออกที่ฉลาดกว่าแน่นอน วิธี awk:

awk '{ip_count[$0]++}; '\
'END {for (ip in ip_count) printf "%15s: %d\n",ip,ip_count[ip];}' file

+1 หากลำดับของเอาต์พุตมีความสำคัญต่อ OP คำตอบนี้ไม่รับประกันใด ๆ : การวนซ้ำคีย์ของอาร์เรย์ที่เชื่อมโยงนั้นไม่มีลำดับโดยธรรมชาติ
เกล็นแจ็คแมน

@glennjackman แต่การเพิ่มsortคำตอบของฉันยังเร็วขึ้นเนื่องจากมีการเรียงรายการน้อยลง ;-)
Hauke ​​Laging

โอ้ใช่? โอ้ใช่?!? ;) อินพุตถูกเรียงลำดับแล้ว คำตอบที่น่าตกใจนี้จะสับพวกเขาดังนั้นจึงยังทำงานได้มากกว่า Nyah! ;)
glenn jackman

0

ไฟล์เรียงลำดับ firest จากนั้นรับนับโดย unic -c

sort filename | uniq -c


1
ไฟล์ถูกเรียงลำดับแล้ว (ตามผู้ใช้ในคำถาม) และuniq -cจะใช้งานได้ แต่ให้ผลลัพธ์ในรูปแบบที่ไม่ถูกต้อง นี่คือเหตุผลที่คำตอบที่ได้รับการยอมรับไม่ได้ใช้และแทนที่จะฟอร์แมตการส่งออกของsort uniq -c
Kusalananda

ขอบคุณ @ Aeyd ฉันกำลังมองหาคำสั่งนี้ มันช่วย
user11392987

0

ฉันจะใช้หลาม linux ststem ทุกวันนี้ติดตั้ง python2 แล้ว

เพิ่มที่อยู่ IP แต่ละรายการลงใน dict (อาเรย์แบบเชื่อมโยง) เป็นคู่ key = value เช่น {"12.34.56.78": 1, "87.76.43.21": 3}

คุณ 'ตรวจสอบ' ที่อยู่ IP เป็นคีย์และเพิ่มค่าโดย 1 ถ้าคุณใช้ defaultdict ("ip") หากไม่มีคีย์รหัสนั้นจะถูกสร้างขึ้นด้วยค่าเริ่มต้นที่ 0 หากมีคีย์อยู่ แล้ว defaultdict ไม่ทำอะไรเลย ค่าจะเพิ่มขึ้นในบรรทัดถัดไป

#!/usr/bin/python2

infile = open("file.txt","r")
iplist = {}  # create an empty dict

for line in infile:
    line = line.strip()   # remove newline.
    if line: # if not a blank line.
        iplist.setdefault(line, 0) # check for ip and add with default value of 0
        iplist[line] += 1 # increment

outfile = open("out.txt","w") #open output file

for key in iplist.keys():
    line = "%-15s = %s" % (key, iplist[key])
    print line   # print uf desired.
    outfile.write(line + "\n")

ไฟล์ outout:

cat out.txt                                                          
27.33.65.2      = 2
58.161.137.7    = 1
121.50.198.5    = 1
184.173.187.1   = 3

ฉันรู้ว่าคุณกำลังมองหาโซลูชันบรรทัดคำสั่ง แต่อย่างที่คุณเห็นมันเป็นจอแสดงผลที่มีการจัดรูปแบบอย่างหรูหราซึ่งใช้เวลาเพียงสิบบรรทัดเท่านั้น Python เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการจัดการ

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