लॉग फ़ाइल में प्रत्येक आईपी पते की गिनती की संख्या दिखाई देती है


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इसलिए सभी आईपी पते क्रम में हैं और सीधे एक दूसरे के बाद हैं।


मैं, व्यक्तिगत रूप से इस तरह की फ़ाइल को पास के DB में एक आसान फ़ाइल में आयात करूँगा (किसी भी postgres उदाहरण में जो मुझे मिला है उसके चारों ओर एक अस्थायी तालिका बनाकर), इसके बाद एक त्वरित SQL कार्रवाई और एक पाठ फ़ाइल पर वापस निर्यात करें।
ओकाद

जवाबों:


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केवल सॉर्ट किए गए इनपुट पर काम करता है (यह आसन्न मिलान लाइनों से मेल खाता है, फ़ाइल से कोई रेखाएं नहीं)।
ओकाद

1
आप उन्हें uniq करने के लिए पाइपिंग करने से पहले परिणाम सॉर्ट करना होगा। यदि आप मूल प्रश्न को पढ़ते हैं, तो ओपी कहता है कि वह पहले से ही उपयोग किए गए परिणामों को क्रमबद्ध कर चुका है sort!
स्लम

2
@HaLLaging - आप जो कह रहे हैं मैं उसकी सराहना करता हूं लेकिन उसी तरह से जैसे कि कंप्यूटर के अधिकांश उपयोगकर्ता OSX और Windows से आगे कभी नहीं बढ़ेंगे, आगे भी यूनिक्स के अधिकांश उपयोगकर्ता विशिष्ट कार्यों के लिए नामित टूल का उपयोग करने से परे उद्यम नहीं करेंगे। AWK का उपयोग करना दिल के बेहोश होने के लिए नहीं है, यह देखें कि AWK बनाम क्या ग्लेन के समाधान की आवश्यकता है, का उपयोग करके आपको इस मूल कार्य को करना था। मुझे लगता है कि मैं यह कहने में निष्पक्ष हो रहा हूं कि मानसिक रूप से समझ के लिए उनका एक सरल समाधान है, हालांकि आपकी संभावना अधिक कुशल है। BTW, मैं यूवी दोनों के बाद से वे दोनों सही कर रहे हैं!
slm

1
@ हॉकिंग - हाँ, बिल्कुल। जब आप साइट के चारों ओर लटकते हैं तो हमारी ज़िम्मेदारियाँ थोड़ी बदल जाती हैं, IMO। हम व्यापक A'ers बनाने के लिए जिम्मेदार हैं और A'ers को देखते हुए हम OP और भविष्य में आने वाले प्रत्येक आगंतुक को फिर से IMO के रूप में शिक्षण क्षण प्रदान करते हैं। लेकिन यह एक व्यक्तिगत पसंद है इसलिए यदि आपके पास केवल कुछ मिनटों का समय है तो किसी भी रूप में ए प्रदान करना हमेशा सराहना की जाती है।
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

फायरस्ट सॉर्ट फ़ाइल तब यूनिक -c द्वारा गणना करें

sort filename | uniq -c


1
फ़ाइल पहले से ही क्रमबद्ध है (प्रश्न में उपयोगकर्ता के अनुसार), और uniq -cकाम करेगा लेकिन गलत प्रारूप पर आउटपुट प्रदान करेगा। यही कारण है कि स्वीकृत उत्तर का उपयोग नहीं होता है sortऔर इसके बजाय आउटपुट का सुधार करता है uniq -c
कुसलानंद

धन्यवाद @Aeyd मैं इस कमांड की तलाश में था। यह मदद करता है
user11392987

0

मैं अजगर का उपयोग करूंगा। आजकल हर linst ststem में python2 स्थापित है।

प्रत्येक आईपी पते को एक प्रमुख (साहचर्य सरणी) में कुंजी = मान जोड़े के रूप में जोड़ें {{"12.34.56.78": 1, "87.76.43.21": 3}।

आप एक महत्वपूर्ण के रूप में आईपी पते को 'सत्यापित' करते हैं और 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

मुझे पता है कि आप एक कमांड लाइन समाधान की तलाश कर रहे थे, लेकिन जैसा कि आप देख सकते हैं कि यह एक सुरुचिपूर्ण स्वरूपित प्रदर्शन है जो केवल एक दर्जन लाइनों को ले गया है। अजगर प्रशासन के लिए एक उत्कृष्ट उपकरण है।

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