লগ ফাইলে প্রতিটি আইপি ঠিকানা প্রদর্শিত হয় তার সংখ্যা গণনা


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

অন্য কথায়, আমি ফাইলটি লুপ করতে এবং প্রতিটি আইপি ঠিকানা প্রদর্শিত হওয়ার সংখ্যা গণনা করতে চাই। আমি ইতিমধ্যে এটি চালিয়েছি sortযাতে সমস্ত আইপি ঠিকানাগুলি যথাযথ এবং একে অপরের পরে থাকে।


আমি, ব্যক্তিগতভাবে, এই ধরণের ফাইলটি একটি সহজেই নিকটস্থ ডিবিতে (আমার আশেপাশে যে কোনও পোস্টগ্রাসের উদাহরণে একটি টেম্প টেবিল তৈরি করে) আমদানি করব, তারপরে একটি দ্রুত এসকিউএল ক্রিয়া করে একটি পাঠ্য ফাইলে ফিরে রফতানি করব।
ওকাদ

উত্তর:


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এটি আমার কাছে দুর্দান্ত পদ্ধতির বলে মনে হচ্ছে না ...
হউক লেগেইং

3
কারণ uniqকেবল বাছাই করা ইনপুটটিতে এটি কাজ করে (এটি সংলগ্ন মিলের লাইনগুলির সাথে মেলে, ফাইল থেকে কোনও লাইন নয়)।
ওকাদ

1
ইউনিকের কাছে পাইপ দেওয়ার আগে আপনাকে অবশ্যই ফলাফলগুলি বাছাই করতে হবে। আপনি যদি আসল কিউটি পড়েন তবে ওপিতে বলা হয়েছে যে ইতিমধ্যে তিনি ফলাফলগুলি ব্যবহার করে বাছাই করেছেন sort!
slm

2
@ হককিজিং - আপনি যা বলছেন তা আমি প্রশংসা করি তবে একইভাবে যে কম্পিউটারের বেশিরভাগ ব্যবহারকারীরা কখনই ওএসএক্স এবং উইন্ডোজকে ছাড়িয়ে যেতে পারে না, তবুও ইউনিক্সের বেশিরভাগ ব্যবহারকারী নির্দিষ্ট কাজের জন্য মনোনীত সরঞ্জামগুলি ব্যবহার করার বাইরে উদ্যোগী হন না। এডাব্লুকে ব্যবহার করা হৃদয়ের হতাশার জন্য নয়, এডাব্লুকে বনাম ব্যবহার করে এই মৌলিক কাজটি সম্পাদন করতে আপনাকে কী করতে হয়েছিল তা দেখুন G গ্লেনের সমাধান কী প্রয়োজন। আমি মনে করি যে আমি এটি বলার ক্ষেত্রে ন্যায়সঙ্গত হচ্ছি যে এটি মানসিকভাবে উপলব্ধি করার সহজ সমাধান, যদিও আপনার সম্ভবত সম্ভবত আরও দক্ষ। বিটিডাব্লু, আমি উভয়ই ইউভি করেছি কারণ তারা উভয়ই সঠিক!
slm

1
@ হককিজিং - হ্যাঁ, ঠিক আপনি যখন সাইটের চারদিকে ঝুলেন তখন আমাদের দায়িত্বগুলি কিছুটা বদলে যায়, আইএমও। আমরা বিস্তৃত এয়ারগুলি তৈরির জন্য এবং আমরা ওপি এবং এটি জুড়ে আগত প্রত্যেক ভবিষ্যতের দর্শকদের শিক্ষার মুহুর্ত হিসাবে প্রদত্ত আয়ার্স দেখার জন্য দায়বদ্ধ, আবার আইএমও। তবে এটি একটি ব্যক্তিগত পছন্দ তাই যদি আপনার কাছে মাত্র কয়েক মিনিট সময় থাকে তবে যে কোনও আকারে একটি সরবরাহ করা সর্বদা প্রশংসিত হয়।
slm

6

uniqপ্রকৃতপক্ষে চালক সমাধান বলে মনে হচ্ছে। অজানা উপায়:

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

+1 টি। যদি আউটপুট ক্রমটি ওপি-র কাছে গুরুত্বপূর্ণ হয় তবে এই উত্তরটি কোনও গ্যারান্টি দেয় না: কোনও এসোসিয়েটিভ অ্যারের কীগুলি দিয়ে পুনরুক্তি করার সহজাত ক্রম নেই।
গ্লেন জ্যাকম্যান

@glennjackman তবে sortআমার উত্তরে যুক্ত করা এখনও দ্রুততর কারণ কম আইটেম বাছাই করতে হবে। ;-)
হউক লেগেছে

ও আচ্ছা? ও আচ্ছা?!? ;) ইনপুটটি ইতিমধ্যে বাছাই করা হয়েছে। এই বিশ্রী উত্তর তাদের পরিবর্তন করে, সুতরাং এটি আরও কাজ করে। Nyah! ;)
গ্লেন জ্যাকম্যান

0

ফায়ারস্ট বাছাই করা ফাইলটি তারপরে ইউনিক-সি দ্বারা গণনা করুন

sort filename | uniq -c


1
ফাইলটি ইতিমধ্যে বাছাই করা হয়েছে (প্রশ্নের ব্যবহারকারী অনুসারে), এবং uniq -cকাজ করবে তবে ভুল ফর্ম্যাটে আউটপুট সরবরাহ করবে। এই কারণেই গৃহীত উত্তর ব্যবহার করে না sortএবং পরিবর্তে এর আউটপুটটিকে পুনরায় ফর্ম্যাট করে uniq -c
কুসালানন্দ

ধন্যবাদ @ আয়েদ আমি এই আদেশটি সন্ধান করছিলাম। এটি সহায়তা করে
ব্যবহারকারীর 11392987

0

আমি পাইথন ব্যবহার করতাম। আজকাল প্রতিটি লিনাক্স স্টেস্টেমে পাইথন 2 ইনস্টল করা আছে।

প্রতিটি আইপি ঠিকানাটি একটি ডিকের (একসোভেটিভ অ্যারে) হিসাবে কী = মান জোড় হিসাবে {"12.34.56.78": 1, "87.76.43.21": 3 into হিসাবে যুক্ত করুন}

আপনি আইপি ঠিকানাটি একটি কী হিসাবে 'যাচাই' করেন এবং মানটি 1 দ্বারা বৃদ্ধি করেন যদি আপনি ডিফল্টডিক্ট ("আইপি") ব্যবহার করেন, যদি কীটি বিদ্যমান না থাকে তবে এটি 0 এর একটি ডিফল্ট মান দিয়ে তৈরি করা হয় যদি কীটি বিদ্যমান না থাকে ইতিমধ্যে, ডিফল্টডিক্ট কিছুই করে না। পরবর্তী লাইনে মান বৃদ্ধি করা হয়।

#!/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")

আউটআউট ফাইল:

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

আমি জানি আপনি একটি কমান্ড লাইন সমাধান খুঁজছিলেন, তবে আপনি দেখতে পাচ্ছেন এটি একটি মার্জিত বিন্যাসযুক্ত প্রদর্শন যা কেবলমাত্র এক ডজন লাইন ধরেছিল। পাইথন প্রশাসনের জন্য একটি দুর্দান্ত সরঞ্জাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.