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


142

अज्ञात लंबाई का एक पाठ फ़ाइल, मैं कैसे उदाहरण के लिए सभी पढ़ सकते हैं, यह देखते हुए लेकिन फ़ाइल के पहले 2 लाइनों? मुझे पता है tailकि मुझे आखिरी एन लाइनें मिलेंगी, लेकिन मुझे नहीं पता कि एन समय से पहले क्या है।

तो एक फाइल के लिए

AAAA
BBBB
CCCC
DDDD
EEEE

मुझे चाहिए

CCCC
DDDD
EEEE

और एक फाइल के लिए

AAAA
BBBB
CCCC

मुझे बस मिल जाएगा

CCCC

जवाबों:


211

tail --help निम्नलिखित देता है:

  -n, --lines=K            output the last K lines, instead of the last 10;
                           or use -n +K to output lines starting with the Kth

तो पहली 2पंक्तियों को फ़िल्टर करने के लिए , -n +3आपको वह आउटपुट देना चाहिए जिसे आप खोज रहे हैं (3 जी से शुरू करें)।


2
अजीब तरह से, मेरा आदमी पृष्ठ विकल्प को सूचीबद्ध नहीं करता है, लेकिन यह ठीक काम करता है - धन्यवाद!
निकोलस एमटी इलियट

@ निकोलस: अजीब, मुझे लगा कि यह ओएस की परवाह किए बिना मानक प्रलेखन होगा। मैंने विंडोज के अंदर Cygwin से खींच लिया है, इसलिए मुझे नहीं पता कि यह विभिन्न लिनक्स डिस्ट्रोस में क्या दिखता है। खुशी है कि यह काम किया।
जो एनोस

@NicholasMTElliott man7 इसे जो एनोस के मैनपेज की तरह सूचीबद्ध करता है, इसलिए यह एक मैनपेज संस्करण का मुद्दा बनने की संभावना है
Uli Köhler

@SteveJorgensen: मुझे समझ नहीं आ रहा है कि आपकी टिप्पणी का क्या जिक्र है; कोई भी इसके लिए उपयोग करने का सुझाव नहीं देता है head?
19

22

मान लें कि आपकी पूंछ का संस्करण इसका समर्थन करता है, तो आप एक्स लाइनों के बाद पूंछ शुरू करने को निर्दिष्ट कर सकते हैं। आपके मामले में, आप 2 + 1 करेंगे।

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

Awk का उपयोग करते हुए एक सरल उपाय:

awk 'NR > 2 { print }' file.name

हम में से एक भ्रमित है। प्रश्न कहते हैं: "सभी लेकिन फ़ाइल की पहली 2 पंक्तियाँ"। उस आज्ञा की आवश्यकता कैसे पूरी होती है?
janm

6
{ print }डिफ़ॉल्ट कार्रवाई है, और छोड़ा जा सकता है।
ट्रिपल

8

कोशिश करो sed 1,2d। आवश्यकतानुसार 2 बदलें।


अपेक्षित के रूप में काम किया .. के रूप में लाइनों के बाद पहली 2 लाइनों अज्ञात हैं।
कुमारप्रसाद

6

tail -n +linecount filenameलाइन पर उत्पादन शुरू कर देंगे linecountकी filenameहै, तो tail -n +3 filename आप क्या चाहते हैं क्या करना चाहिए।


यह मेरे खोल में काम नहीं करेगा लेकिन tail -n +17 filenameहोगा। मैं
isomorphismes

2
@iso: हेड-अप के लिए धन्यवाद - tailमेरे मूल उत्तर में उपयोग किए गए वाक्यविन्यास को स्वीकार किए जाने के पुराने संस्करणों , लेकिन अब एक को स्पष्ट -nविकल्प का उपयोग करने की आवश्यकता है । मैंने उसी हिसाब से अपना जवाब अपडेट किया है।
जिम लुईस

0

इसका प्रयोग करें, पहले नमूने को दबाकर नमूना कहा जाता है tail --lines=3 sample1.dat जो तीसरी पंक्ति से अंतिम पंक्ति तक सभी पंक्तियों को प्रिंट करेगा।

दूसरे नमूने के लिए, फिर से मान लीजिए कि इसे sample2.dat कहा जाता है, यह वह होगा tail --lines=-1 sample2.datजो अंतिम पंक्ति को प्रिंट करेगा ...


@ जिम: आपका और मेरा क्या फर्क है? .... वही बात ....: ओ मैं दो सैंपल डेटा फाइल इनपुट्स में अपने सवाल के अनुसार बता रहा था और दिखा रहा था कि वह कैसे हासिल करना चाहता था ... ।
t0mm13b

ठीक है ... फिर उसने दूसरा नमूना क्यों मांगा और वह परिणाम दिखाया जो वह चाहता था जो कि मैंने 'टेल --लाइन = -1' का इस्तेमाल किया था ...... निश्चित रूप से आप फ़ाइल नाम को पूरी तरह से छोड़ सकते हैं और अभी भी एक पाइप के रूप में कार्य कर सकता है ... हम्म
t0mm13b

@tommie: उफ़, भूल जाओ कि मैंने पाइपों के बारे में क्या कहा था ... मैं कुछ अन्य उपयोगिता के बारे में सोच रहा होगा। लेकिन मेरा कहना था कि एक एकल आदेश, tail +3 anyfileसामान्य मामले के लिए वांछित परिणाम देता है, जबकि tail --lines=Nवांछित परिणाम देने के लिए एन को पहले से जानने की आवश्यकता होती है।
जिम लुईस

@tommie: लेकिन यह है tail... कि "नीचे" होना चाहिए? (बा-डम टिश! थैंक यू, मैं यहां सप्ताह भर रहूंगा ...)
जिम लुईस

0

मुझे वास्तव में यह पता नहीं है कि इसे केवल पूंछ या सिर से कैसे किया जाता है, लेकिन wc -l(लाइन काउंट) और बैश अभिव्यक्ति की सहायता से, आप इसे प्राप्त कर सकते हैं।

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

उम्मीद है की यह मदद करेगा।


1
पूंछ चलाने से पहले फ़ाइल पर पूर्ण पास की आवश्यकता होती है। यदि फ़ाइल मेमोरी के आकार से अधिक है, तो यह बहुत अक्षम होगा। यह दो लाइनों से कम की फाइलों को हैंडल नहीं करता है। यह wc और टेल के बीच फ़ाइल बदलने के आकार को नहीं संभालता है।
janm

2
@ भजन: आप बिलकुल ठीक हैं। अन्य उत्तर सिर्फ बेहतर हैं। मुझे शर्मिंदगी महसूस होती है। :
नवां मैन

-1

का उपयोग कर awk सभी लेकिन अंतिम 2 लाइन पाने के लिए

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

सभी 2 पंक्तियों को पाने के लिए जागें

awk 'NR>2' file

या आप अधिक उपयोग कर सकते हैं

more +2 file

या सिर्फ बैश करें

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

अब यह आवश्यकता को पूरा नहीं करता है। प्रश्न "सभी लेकिन फ़ाइल की पहली 2 पंक्तियों" को कहता है और दो उदाहरण देता है, प्रत्येक एक एकल फ़ाइल के साथ, जहां पहली दो पंक्तियाँ छोड़ दी जाती हैं और शेष फ़ाइल को stdout में भेज दिया जाता है। यह वह नहीं है जो यह आदेश करता है।
janm

हां, मैंने सवाल को गलत बताया। सोचा कि वह सभी लेकिन अंतिम 2 लाइनों के लिए पूछ रहा है।
ghostdog74
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.