पूंछ के विपरीत: अंतिम एन लाइनों को छोड़कर सभी लाइनें


36

मैं एक यूनिक्स कमांड लाइन फिल्टर के साथ फाइल की अंतिम एन लाइनों को कैसे छोड़ सकता हूं?

इसके विपरीत की तरह होगा tail: tailपहली n लाइनों को छोड़ देता है, लेकिन बाकी को पाइप के माध्यम से हटा देता है, लेकिन मैं चाहता हूं कि अंतिम n लाइनों को छोड़कर सब कुछ के माध्यम से कमांड पाइप हो ।

दुर्भाग्य से मुझे ऐसा कुछ भी नहीं मिला - यह भी headमदद नहीं करता है। EDIT : कम से कम सोलारिस में यह नकारात्मक तर्क नहीं लेता है।

अपडेट: मैं ज्यादातर ऐसे समाधान में रुचि रखता हूं जो बड़ी फ़ाइलों के लिए काम करता है, अर्थात लॉगफ़ाइल्स, जहां आप अंतिम मिनट में क्या हुआ, इसका निरीक्षण करना चाहते हैं।


FYI करें जब सिर का उपयोग करें: -n विकल्प के साथ नंबर के सामने '-' रखकर, यह प्रत्येक फ़ाइल की सभी पंक्तियों को प्रिंट करता है लेकिन अंतिम एन लाइनों को नहीं दिखाया गया है,
G Koe

जवाबों:


38

यदि आपके पास जीएनयू है head, तो आप उपयोग कर सकते हैं

head -n -5 file.txt

लेकिन के अंतिम 5 लाइनों सभी मुद्रित करने के लिए file.txt

यदि head -nकोई नकारात्मक तर्क नहीं लेता है, तो प्रयास करें

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt

11
(और प्रार्थना करें कि file.txtकम से कम छह लाइनें लंबी हों ...)
एक CVn

1
अफसोस की बात है कि यह गैर-जीएनयू संस्करण धाराओं के साथ काम नहीं करता है, या तो
आर्मंड

1
@ MichaelKjörling कम से कम ubuntu पर, यह कोई समस्या नहीं है। यदि फ़ाइलों में निर्दिष्ट लाइनों की तुलना में कम लाइनें हैं head, तो एक खाली आउटपुट वापस आ जाता है, जिसमें कोई त्रुटि नहीं है।
अल्फा जूना

अगर मैं गलत नहीं हूँ सिर -n 5 पहली 5 पंक्तियों को प्रिंट करेगा, सभी नहीं, लेकिन अंतिम 5 ...
pypmannetjies

8
head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5

1
यह क्या जोड़ता है जो स्वीकृत उत्तर में उत्तर नहीं दिया गया था? इसके अलावा, आपके अन्य उत्तरों के साथ, आपके उत्तर की व्याख्या की कुछ पंक्तियों से इसमें बहुत सुधार होगा।
संगीत 2

1
बहुत अच्छा सारांश
ruanhao

5

यहां अंतिम पंक्ति को हटाने का एक सरल तरीका है, जो बीएसडी आदि पर काम करता है।

sed '$d' input.txt

अभिव्यक्ति "अंतिम पंक्ति पर है, इसे हटा दें"। अन्य पंक्तियों को मुद्रित किया जाएगा, क्योंकि यह sedडिफ़ॉल्ट व्यवहार है।

आप कई लाइनों को हटाने के लिए उन्हें एक साथ चेन कर सकते हैं

sed '$d' input.txt | sed '$d' | sed '$d'

जो थोड़ी भारी-भरकम हाथ वाली है, बेशक, लेकिन फाइल के माध्यम से केवल एक स्कैन होता है।

अधिक जवाब के लिए आप इस पर भी नज़र डाल सकते हैं: https://stackoverflow.com/questions/13380607/how-to-use-sed-sed-to-remove-last-n-lines-of-a-file

यहाँ मेरे पसंदीदा में से एक से एक लाइनर अनुकूलित है:

N=10
sed -n -e ':a' -e "1,$N!{P;N;D;};N;ba"

मुझे मज़ा आया कि एक को निस्तब्ध कर दो, और मुझे आशा है कि तुम भी करोगे: (यह बफर Nलाइनें करता है क्योंकि यह स्कैन करता है, लेकिन अन्यथा बहुत कुशल है।


3

मैं उत्सुक हूं कि आपको क्यों लगता headहै कि कोई विकल्प नहीं है:

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10; 
        with the leading `-', print all but the last K lines of each file

उदाहरण के लिए, यह आपके उद्देश्य को पूरा करने के लिए उपयुक्त है:

head -n -20 yourfile.txt

5
ध्यान दें कि यह केवल GNU पर लागू होता है head। BSD के headपास यह विकल्प नहीं है, इसलिए यह उत्तर GNU Coreutils के बिना Solaris या अन्य Unixes पर काम नहीं करेगा । ओपी ने इसे विशेष रूप से यूनिक्स और यूनिक्स-यूटिल्स के साथ टैग किया।
13'13

2
@ एसएलएचके इस तथ्य का उल्लेख नहीं करने के लिए कि ओपी ने उल्लेख किया कि यह सोलारिस के लिए है।
एक CVn

दुर्भाग्य से किसी ने सोलारिस के मेरे उल्लेख को हटा दिया। लेकिन मुझे वैसे भी उल्लेख करना चाहिए था कि सिर के संस्करण का समर्थन नहीं करता है।
हंस-पीटर स्टॉर्र

1
क्षमा करें सब। सोलारिस को नोटिस नहीं किया, न ही मुझे सिर के विभिन्न संस्करणों के बारे में पता था।
एंडर्स आर। बिस्ट्रुप

1
@ हस्ट्रोइर सोलारिस अब आपके टैग में है :)
स्लोक

0

tail -nनकारात्मक तर्क नहीं करेंगे तो यह करने का एक और तरीका है

tac file.txt | tail -n +6 | tac

यह अंतिम 5 लाइनों को हटा देगा


धन्यवाद! यह एक अच्छा विचार है कि कोई भी अब तक साथ नहीं आया है। दुर्भाग्य से यह इस सवाल के साथ मेरे दिमाग में आने वाले अशांति के लिए काफी अक्षम होगा: यदि यह एक बड़ी फाइल है, तो यह न केवल एक या एक से अधिक बार, अन्य समाधानों के साथ पूरी तरह से पढ़ी जाएगी, बल्कि यह भी संभवतः लिखी जाएगी। यह मेमोरी में फिट नहीं है, तो टीएसी द्वारा अस्थायी फ़ाइलों को डिस्क।
हंस-पीटर स्टॉर

@ हंस-पीटर बहुत सच है। इसके लिए एक python3 स्क्रिप्ट लिखने का फैसला किया। इस github.com/atw31337/donkey को आज़माएं । मैं आउटपुट विकल्पों का उपयोग करने की सलाह देता हूं। वे रीडायरेक्ट का उपयोग करने की तुलना में बहुत तेज चलाते हैं।
atw31337

अच्छी तरह से लिखा है! हालाँकि, यह फ़ाइल के माध्यम से दो बार पढ़ा जाता है, जो वास्तव में आवश्यक नहीं है यदि आप अंतिम n लाइनों को बफर करते हैं, और यह बड़ी फ़ाइलों पर एक समस्या है। व्यक्तिगत रूप से, मुझे अब इसकी आवश्यकता नहीं है, लेकिन अगर आपको इसमें सुधार करने में मज़ा आता है और अन्य लोगों को इसकी आवश्यकता है ... प्रश्न पर सभी कुछ पसंद और बुकमार्क थे।
हंस-पीटर स्टॉर

@ हंस-पीटर। बफ़र का आकार हटाए जाने वाली लाइनों की संख्या पर निर्भर करेगा। यह एक समस्या हो सकती है यदि फ़ाइल से बहुत बड़ी संख्या में लाइनों को हटाने की आवश्यकता हो। स्मृति से संबंधित मुद्दों से बचने के लिए, मैंने उच्च एन मानों के साथ लाइन काउंट विधि और निम्न मान वाले बफरिंग विधि का उपयोग करने के लिए स्क्रिप्ट को फिर से लिखा; हालाँकि, एक बहुत बड़ी फ़ाइल पर इसका परीक्षण करने के बाद, मूल पंक्ति गणना विधि अभी भी तेज़ है। ऐसा लगता है कि बफ़र प्रबंधन ओवरहेड लाइन काउंट ओवरहेड से आगे निकल जाता है ... या मैं बस कुछ याद कर रहा हूं।
atw31337

अच्छा है, लेकिन BSD-variant Mac OS X के लिए डिफ़ॉल्ट रूप से कोई tac कमांड नहीं है। :( इस तरह का उपयोग मामले को हरा देता है।
4:16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.