2012-01-25 18 views
5

मैं फ़ाइलों का एक सेट भर में लाइनों को निकालने के लिए उपयोग कर रहा हूँ ग्रेप भर में आयोजित मुकाबलों:ग्रेप अंतिम n फ़ाइलें

ग्रेप somestring * .log

इसे करने के लिए फ़ाइल प्रति मैचों की अधिकतम संख्या को सीमित करना संभव है प्रत्येक फाइल से अंतिम एन मैचों?

उत्तर

7

खैर मुझे लगता है कि ग्रेप एन फ़ाइल के अंत से मेल खाता है सीमित करने के लिए समर्थन नहीं करता है तो यह आपको बस इतना करना

ls *.log | while read fn; do grep -iH create "$fn" | tail -1; done 

बदलें tail -1 -1 एन के साथ (एच विकल्प हैं क्या है मुद्रित करने के लिए है फ़ाइल नाम अन्यथा प्रिंट नहीं किया जाएगा यदि आप एक फ़ाइल में grep हैं और वास्तव में हम ऊपर कर रहे हैं)

नोट: ऊपर सोलन रिक्त स्थान के साथ फ़ाइल नामों के साथ ठीक काम करेगा।

N के लिए फ़ाइल की शुरुआत से मेल खाता है

grep -i -m1 create *.log 

एन

+0

कहना 'का उपयोग करते हुए इस तरह ls' एक बहुत बुरा विचार हो सकता है। यहां यह है [क्यों] (http://mywiki.wooledge.org/ParsingLs)? –

+1

@ जयपाल 'बहुत बुरा विचार' अच्छी तरह से अगर उपरोक्त मामले में लॉग फाइल ज्ञात स्रोतों द्वारा बनाई गई हैं तो यह सोलन ओवर-इंजीनियर को समझ में नहीं आता है। और यदि वे नहीं हैं, तो मैं अतिरिक्त जटिलता को समझ सकता हूं। – havexz

+0

'grep पैटर्न फ़ाइल | पूंछ -1 करेंगे – Azi

1

यहां कफ के प्रकार की तरह, लेकिन How to do something to every file in a directory using bash? को शुरुआती बिंदु के रूप में पढ़ें। मेरी फाइल ले लीजिए, प्रत्येक फ़ाइल से केवल पिछले 20 मैचों को मानते हुए।

for i in * 
do 
    if test -f "$i" 
    then 
    grep somestring $i | tail -n 20 
    fi 
done 

पूरी तरह से सही नहीं हो सकता है, मेरे पास फाइलों के साथ जांच करने के लिए मेरे पास फाइलें नहीं हैं, लेकिन एक प्रारंभिक बिंदु होना चाहिए।

1
for file in /path/to/logs/*.log 
do 
    tail <(grep -H 'pattern' "$file") 
done 

साथ -m1 1 की जगह यह पिछले 10 लाइनों डिफॉल्ट सूचियों द्वारा tail के रूप में पिछले 10 मैचों सूची जाएगा।आप एक अलग संख्या प्राप्त करना चाहते हैं तो निम्नलिखित में मदद मिलेगी -

for file in /path/to/logs/*.log 
do 
    tail -n number <(grep -H 'pattern' "$file") 
done 

जहां number लाइनों

0

अंतिमखोज वर्तमान निर्देशिका के तहत हर लॉग फ़ाइल में पैटर्न की घटना की अपनी संख्या हो सकती है:

find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1" 

पहलेखोज patte की घटना वर्तमान निर्देशिका के तहत हर लॉग फ़ाइल में आर एन:

find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | head -n1" 

घटनाओं की संख्या के साथ -n1 में 1 की जगह आप


चाहते वैकल्पिक रूप से आप उपयोग कर सकते हैं xargs

find . -name \*log\* -exec sh -c "grep --color=always -iH pattern {} | tail -n1" \; 
के बजाय -exec विकल्प find की

आप के लिए लॉग फ़ाइलों के अपनी खोज को सीमित करने के लिए find साथ -mtime उपयोग कर सकते हैं, के 5 दिनों के

find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"

संबंधित मुद्दे