मार्को सीप्पी इसके awk
लिए एक बेहतर उपकरण होने के बारे में सही है लेकिन awk भी एक बेहतर उपकरण है sort
और uniq
चूंकि उस तर्क को इसमें स्थानांतरित किया जा सकता है awk
। अगर आप सिर्फ 1000 लाइनों को पूंछ रहे हैं तो इससे बहुत अधिक फर्क नहीं पड़ता है, लेकिन अगर आप एक विशाल मल्टी गिग लॉग फाइल को देखना चाहते हैं, तो इसे अंदर ले जाने के लिए तेजी से परिमाण के आदेश हो सकते हैं awk
।
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
वह करेंगे जो आपको चाहिए लेकिन बड़ी फ़ाइलों के लिए बहुत तेज़ है। यह आईपी की एक सरणी को जागृत करता है, आईपी पते को एक कुंजी के रूप में उपयोग करता है और आईपी जितनी बार होता है मूल्य के रूप में होता है।
गति आती है क्योंकि awk डेटा पर एक पास करता है और अंतिम आउटपुट को छाँटने के अलावा अधिकांश काम करता है। दूसरी विधि का उपयोग करते हुए, यदि आपके पास हस्तांतरण लॉग में 1,000,000 पंक्तियाँ हैं, तो awk उन 1,000,000 पंक्तियों को पढ़ता है जो 1,000,000 IPs से बाहर निकलती हैं, फिर सॉर्ट पूरे 1,000,000 IP पर हो जाती है, अब सॉर्ट किए गए 1,000,000 IP को uniq में भेजती है, जो इसे बहुत कम कर देता है सॉर्ट करने से पहले डेटा की मात्रा। 1,000,000 IP पर कई पास करने / करने के बजाय, awk एक पास में लगभग सब कुछ करता है।
मेरे लैपटॉप पर 5,513,132 लाइन अपाचे लॉग (1.1 गिग्स) का उपयोग करना, यहां गति की तुलना है:
- 2 मी 45 से
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0 मी 40 से
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n