लाइनों की घटना की संख्या और संख्या की गणना करें


145

मेरे पास Apacheलॉगफ़ाइल है, access.logउस फ़ाइल में लाइन घटना की संख्या कैसे गिना जाए? उदाहरण के लिए परिणाम cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'है

a.php
b.php
a.php
c.php
d.php
b.php
a.php

जो परिणाम मुझे चाहिए वह है:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

25
| sort | uniq -c
कोस्टा

3
| LC_ALL=C sort | LC_ALL=C uniq -c
स्टीफन चेज़लस

आह मुझे कभी नहीं पता था कि uniqऐसा कर सकते हैं ..
कोकिज़ू

क्या आपके पास लॉग में लाइन का एक उदाहरण है, जैसा कि मुझे लगता है कि यह सभी पाइपों के बिना awk के साथ किया जा सकता है।

यह ठीक है, 8.1GB लॉग फ़ाइल लगभग 2 मिनट में संसाधित हुई, और यह अब के लिए किया गया है, अब इसकी कोई आवश्यकता नहीं है: 3
कोकिज़ू

जवाबों:


196
| sort | uniq -c

जैसा कि टिप्पणियों में कहा गया है।

आउटपुट को पाइपिंग में आउटपुट को sortवर्णमाला / संख्यात्मक क्रम में व्यवस्थित करता है।

यह एक आवश्यकता है क्योंकि uniqकेवल दोहराया लाइनों पर मेल खाता है, अर्थात

a
b
a

यदि आप uniqइस पाठ फ़ाइल का उपयोग करते हैं, तो यह निम्नलिखित को लौटाएगा:

a
b
a

ऐसा इसलिए है क्योंकि दो aएस अलग-अलग हैं b- वे लगातार लाइनें नहीं हैं। हालाँकि अगर आप पहली बार वर्णमाला के क्रम में डेटा को क्रमबद्ध करते हैं

a
a
b

फिर uniqदोहराई जाने वाली लाइनों को हटा देगा। -cका विकल्प uniqमायने रखता है डुप्लिकेट की संख्या और रूप में उत्पादन प्रदान करता है:

2 a
1 b

संदर्भ:


1
यूनिक्स और लिनक्स में आपका स्वागत है :) अपने उत्तर में अधिक विवरण जोड़ने में संकोच न करें और बताएं कि यह क्यों और कैसे काम करता है?)
जॉन डब्ल्यूएच स्मिथ

1
printf '%s\n' ①.php ②.php | sort | uniq -cमुझे देता है2 ①.php
स्टीफन चेज़लस

@ php\nphp

4
@ जैडर, नहीं, ऐसा इसलिए है क्योंकि मेरे लोकल में ①.phpसमान है ②.phpक्योंकि मेरे लोकेल में उन और चरित्र के लिए कोई क्रमबद्ध क्रम निर्धारित नहीं है । यदि आप किसी बाइट मान के लिए अद्वितीय मान चाहते हैं (याद रखें कि फ़ाइल पथ आवश्यक रूप से पाठ नहीं हैं), तो आपको लोकेल को C: पर ठीक करने की आवश्यकता है | LC_ALL=C sort | LC_ALL=C uniq -c
स्टीफन चेजलस

2
परिणामी गणना फ़ाइल को क्रमबद्ध करने के लिए आपको नीचे दिए गए "eduard-florinescu" के रूप में "सॉर्ट -nr" को जोड़ने पर विचार करना चाहिए।
लुआइज़ सुऑन

104
[your command] | sort | uniq -c | sort -nr

स्वीकृत उत्तर लगभग पूरा हो गया है आप sort -nrअंत में एक अतिरिक्त जोड़ना चाह सकते हैं ताकि परिणाम सबसे अधिक बार हो

uniq विकल्प:

-c, --count
       prefix lines by the number of occurrences

सॉर्ट विकल्प:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

विशेष स्थिति में आपके द्वारा सॉर्ट की जा रही लाइनें संख्याएं हैं, आपको sort -grइसके बजाय उपयोग की आवश्यकता है sort -nr, टिप्पणी देखें


3
मुझे -nविकल्प के बारे में बताने के लिए बहुत बहुत धन्यवाद ।
सिगुर

2
शानदार जवाब, यहाँ मैं एक वाक्य के साथ फ़ाइल से बाहर एक शब्दकूट प्राप्त करने के लिए क्या उपयोग करता हूं tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt:। पहली कमांड नई लाइनों के साथ रिक्त स्थान की जगह लेती है, जिससे बाकी कमांड को अपेक्षित रूप से काम करने की अनुमति मिलती है।
बार

2
उपरोक्त विकल्पों का उपयोग करके मुझे "23344" से पहले "1" मिलता है। sort -grइसके बजाय इसका उपयोग करना हल करता है। -g: सामान्य संख्यात्मक मान के अनुसार तुलना करें (इसके बजाय -n: स्ट्रिंग संख्यात्मक मूल्य के अनुसार तुलना करें)।
पीटर जरी

@PeterJaric ग्रेट कैच और इसके बारे में जानने के लिए बहुत उपयोगी है, -grलेकिन मुझे लगता है कि का उत्पादन uniq -cऐसे sort -nrहोगा जैसा कि इरादा होगा
Eduard Florinescu

3
दरअसल, जब डेटा नंबर होते हैं, तो -grबेहतर काम करता है। इन दो उदाहरणों की कोशिश करें, केवल जी और एन झंडे में भिन्न: echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrऔर echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr। पहला एक गलत तरीके से होता है, लेकिन दूसरा नहीं।
पीटर जरी

9

आप पर एक साहचर्य सरणी का उपयोग कर सकते awk और फिर -optionally- प्रकार :

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

उत्पादन:

1 c.php
1 d.php
2 b.php
3 a.php

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