2010-09-23 11 views
11

क्या एक सरल खोल कमांड के साथ केवल लाइनों की अंतिम 10 पंक्तियां रखना संभव है?मैं फ़ाइल से आखिरी 10 लाइनों के अलावा सभी को कैसे हटा सकता हूं?

tail -n 10 test.log 

सही परिणाम देता है, लेकिन मैं खुद को test.log संशोधित करने के लिए कैसे पता नहीं है। और

tail -n 10 test.log > test.log 

काम नहीं करता है।

+3

अंगूठे के नियम के रूप में, इनपुट और आउटपुट के रूप में एक साथ फ़ाइल का कभी भी उपयोग नहीं करते हैं, आप कभी नहीं जानते कि यह कैसे समाप्त होगा। – tokland

+0

अच्छी सलाह। मैंने अभी 'tail -n 10 test.log> test.log' किया है और कुछ भी नहीं (एक खाली फ़ाइल) समाप्त हो गया है। – sam

उत्तर

16

आप tempfile का उपयोग करके ऐसा कर सकते हैं।

tail -n 10 test.log > test1.log 

mv test1.log test.log 
+0

यह काम करता है, धन्यवाद। हालांकि, ** '1' ** को न भूलें क्योंकि मैंने' tail -n 10 test.log> test.log' किया था और मुझे एक खाली फ़ाइल के साथ छोड़ दिया गया है! – sam

1

आह्वान एड आदेश (पाठ संपादक):

echo -e '1,-10d\nwq' | ed <filename> 

यह कमांड लाइनों को हटाने के लिए ('1, -10d') भेज देंगे फाइल को सेव ('मौ') और निकास ('क्ष ')।

यह भी ध्यान दें कि एड विफल रहता है (वापसी कोड 1 है) जब इनपुट फ़ाइल में 11 से कम पंक्तियां होती हैं।

संपादित करें: तुम भी vi संपादक (या पूर्व आदेश) का उपयोग कर सकते हैं:

vi - +'1,-10d|wq' <filename> 

लेकिन 10 या उससे कम लाइनों vi संपादक खोला है, तो इनपुट फ़ाइल है जाएगा रहने और आप टाइप करना होगा ': q' बाहर निकलने के लिए (या पूर्व कमांड के साथ 'क्यू')।

LOG=$(tail -n 10 test.log) 
echo "$LOG" > test.log 
1

इसके अलावा, आप एक चर का उपयोग कर सकते हैं। वे न्यूलाइन पात्रों को संरक्षित करते हैं।

8
echo "$(tail -n 10 test.log)" > test.log 

उद्धरण महत्वपूर्ण हैं:

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