2012-08-06 12 views
29

क्या पिछली एन लाइनों के अलावा सभी फाइलों को मुद्रित करने के लिए कोई (POSIX कमांड लाइन) तरीका है? केस का प्रयोग करें, मेरे पास अज्ञात आकार की कई फाइलें होंगी, जिनमें से सभी को ज्ञात आकार का बॉयलरप्लेट फ़ूटर होगा, जिसे मैं निकालना चाहता हूं। मैं सोच रहा था कि क्या पहले से ही एक उपयोगिता है जो इसे लिखने से पहले करता है।आखिरी एन लाइनों को छोड़कर सभी चीजों को उलटा/प्रिंट करना?

उत्तर

33

सिर के अधिकांश संस्करण (1) - जीएनयू विशेष रूप से व्युत्पन्न, लेकिन बीएसडी व्युत्पन्न नहीं - इसमें ऐसा करने की सुविधा है। यदि आप प्रिंट करने के लिए लाइनों की संख्या के लिए ऋणात्मक संख्या का उपयोग करते हैं तो यह अंत को छोड़कर फ़ाइल के शीर्ष को दिखाएगा।

तो जैसा

:

head -n -10 textfile 
+8

पॉज़िक्स में, हालांकि, एक सकारात्मक पूर्णांक होना चाहिए। – choroba

+1

सख्त POSIX के लिए पर्याप्त है। मुझे अपने "सबसे" के साथ स्पष्ट होना चाहिए था। यदि आप अधिक तेज़ और गंदे POSIX विधि के लिए जा रहे हैं, तो मुझे लगता है कि 'wc -l' प्लस कुछ गणित आपको' head' –

+0

पर जाने के लिए एक मूल्य प्राप्त करेगा, इस सुविधा की कमी (1) के अधिकांश कार्यान्वयन की कमी है। केवल उन्हीं कार्यान्वयन के बारे में मुझे पता है कि यह गैर-पोर्टेबल कोड है। –

4

head उपयोगिता अपने दोस्त है।

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 
+3

पॉज़िक्स में, हालांकि, एक सकारात्मक पूर्णांक होना चाहिए। – choroba

+4

दुर्भाग्यवश बीएसडी व्युत्पन्न (यानी ओएसएक्स) सिस्टम पर नकारात्मक मान मान्य तर्क नहीं हैं - – Tossrock

0

पाद लेख एक सुसंगत लाइन कि कहीं और प्रकट नहीं होता है के साथ शुरू होता है, तो आप sed उपयोग कर सकते हैं:

sed '/FIRST_LINE_OF_FOOTER/q' filename 

कि पाद लेख की पहली पंक्ति मुद्रित करता है; आप से बचने के लिए कि चाहते हैं:

sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename 

यह गिनती लाइनों की तुलना में अधिक मजबूत किया जा सकता है, तो भविष्य में पाद लेख में परिवर्तन के आकार। (या पहली पंक्ति में बदलाव होने पर यह कम मजबूत हो सकता है।)

एक और विकल्प, यदि आपके सिस्टम का head कमांड head -n -10 का समर्थन नहीं करता है, तो आप जिस लाइन को दिखाना चाहते हैं उसकी संख्या को प्रीकंप्यूट करना है। निम्नलिखित बैश विशेष वाक्य रचना पर निर्भर करता है:

lines=$(wc -l < filename) ; ((lines -= 10)) ; head -$lines filename 

ध्यान दें कि head -NUMBER वाक्य रचना पिछली संगतता के लिए head के कुछ संस्करणों के द्वारा समर्थित है; POSIX केवल head -n NUMBER फ़ॉर्म पर अनुमति देता है। पॉज़िक्स भी सकारात्मक दशमलव पूर्णांक होने के लिए -n पर तर्क को अनुमति देता है; head -n 0 जरूरी नहीं है कि नो-ऑप।

एक POSIX अनुरूप समाधान है:

lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename 

आप प्राचीन पूर्व POSIX के गोले से निपटने के लिए की जरूरत है, तो आप इस पर विचार हो सकता:

lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename 

इनमें से किसी अगर अजीब बातें करते हैं हो सकता है एक फ़ाइल 10 या कम लाइन लंबी है।

+0

पीओएसईक्स के पास कमांड प्रतिस्थापन के लिए प्राचीन बैकटिक्स के अलावा '$ (...)' वाक्यविन्यास है, और इसमें '$ ((...)) 'अंकगणितीय विस्तार। तो बैकटिक्स और 'expr' के साथ प्राचीन जाने की जरूरत नहीं है। [पॉज़िक्स कमांड सबस्टिट्यूशन] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03) – geirha

+1

@geirha: अच्छा बिंदु, और सवाल विशेष रूप से POSIX के बारे में पूछता था। लेकिन प्राचीन वाक्यविन्यास को जानना उपयोगी हो सकता है यदि किसी भी प्री-पॉज़िक्स शैल अभी भी उपयोग में हैं। –

3

ऐसा करने के लिए कोई मानक आदेश नहीं है, लेकिन आप एन लाइनों के बफर को भरने के लिए अजीब या sed का उपयोग कर सकते हैं, और इसे पूर्ण होने के बाद सिर से प्रिंट कर सकते हैं। जैसेawk साथ:

awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file 
10

"WC" "गणित" + "पूंछ" विधि + की तुलना में शायद कम कुशल है, लेकिन आसान को देखने के लिए:

tail -r file.txt | tail +NUM | tail -r 

कहाँ NUM एक से अधिक है समाप्ति लाइनों की संख्या जिन्हें आप निकालना चाहते हैं, उदाहरण के लिए +11 आखिरी 10 लाइनों के अलावा सभी प्रिंट करेगा। यह बीएसडी पर काम करता है जो head -n -NUM वाक्यविन्यास का समर्थन नहीं करता है।

0

यह आसान है। आपको उन पंक्तियों की संख्या में + जोड़ना होगा जिन्हें आप टालना चाहते थे।

यह उदाहरण आप के लिए 10 -n पहले 9

पूंछ inputfile

को छोड़कर सभी लाइनों (हाँ, नहीं पहले 10 ... क्योंकि यह अलग मायने रखता है ... अगर आप चाहते हैं देता है 10, बस पूंछ-एन 11 इनपुटफाइल टाइप करें)

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

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