यदि आप X को Y सम्मिलित करना चाहते हैं (1 पर क्रमांकन शुरू कर रहे हैं), का उपयोग करें
tail -n +$X /path/to/file | head -n $((Y-X+1))
tail
पहली X-1 लाइनों को पढ़ेगा और छोड़ देगा (इसके आसपास कोई रास्ता नहीं है), फिर निम्न पंक्तियों को पढ़ें और प्रिंट करें। head
पढ़ी जाएगी और लाइनों की अनुरोधित संख्या प्रिंट करें, फिर बाहर निकलें। जब head
बाहर निकलता है, tail
एक SIGPIPE सिग्नल प्राप्त करता है और मर जाता है, तो यह इनपुट फ़ाइल से लाइनों के बफर आकार (आमतौर पर कुछ किलोबाइट) से अधिक नहीं पढ़ा होगा।
वैकल्पिक रूप से, जैसा कि गोर्की ने सुझाव दिया था, सेड का उपयोग करें:
sed -n -e "$X,$Y p" -e "$Y q" /path/to/file
हालांकि, सॉल्यूशन सॉल्यूशन काफी धीमा है (कम से कम जीएनयू यूटिलिटीज और बिजीबॉक्स यूटिलिटीज के लिए; सीड अधिक प्रतिस्पर्धी हो सकता है यदि आप किसी ओएस पर फाइल का बड़ा हिस्सा निकालते हैं जहां पाइपिंग स्लो है और सेड तेज है)। यहां लिनक्स के तहत त्वरित बेंचमार्क हैं; डेटा द्वारा उत्पन्न किया गया था seq 100000000 >/tmp/a
, वातावरण लिनक्स / amd64 है, /tmp
tmpfs है और मशीन अन्यथा निष्क्रिय है और स्वैपिंग नहीं है।
real user sys command
0.47 0.32 0.12 </tmp/a tail -n +50000001 | head -n 10 #GNU
0.86 0.64 0.21 </tmp/a tail -n +50000001 | head -n 10 #BusyBox
3.57 3.41 0.14 sed -n -e '50000000,50000010 p' -e '50000010q' /tmp/a #GNU
11.91 11.68 0.14 sed -n -e '50000000,50000010 p' -e '50000010q' /tmp/a #BusyBox
1.04 0.60 0.46 </tmp/a tail -n +50000001 | head -n 40000001 >/dev/null #GNU
7.12 6.58 0.55 </tmp/a tail -n +50000001 | head -n 40000001 >/dev/null #BusyBox
9.95 9.54 0.28 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #GNU
23.76 23.13 0.31 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #BusyBox
यदि आप उस बाइट रेंज को जानते हैं जिसके साथ आप काम करना चाहते हैं, तो आप इसे सीधे शुरुआत की स्थिति में छोड़ कर तेजी से निकाल सकते हैं। लेकिन लाइनों के लिए, आपको शुरुआत से पढ़ना होगा और नए अंक गिनने होंगे। ब्लॉक को एक्सक्लूसिव से y में एक्सक्लूसिव से निकालने के लिए 0 से शुरू करके, b के ब्लॉक आकार के साथ:
dd bs=$b seek=$x count=$((y-x)) </path/to/file