जवाबों:
head
काम करता है:
head -c 100 file # returns the first 100 bytes in the file
.. पहले 100 बाइट निकालें और उन्हें वापस कर दें।
इसके लिए उपयोग करने head
के बारे में क्या अच्छा है कि tail
मैचों के लिए वाक्य रचना :
tail -c 100 file # returns the last 100 bytes in the file
आप बाइट्स की रेंज प्राप्त करने के लिए इन्हें मिला सकते हैं। उदाहरण के लिए, किसी फ़ाइल से दूसरा 100 बाइट्स head
प्राप्त करने के लिए, अंतिम 200 पाने के लिए पहले 200 को पढ़ें और पूंछ का उपयोग करें:
head -c 200 file | tail -c 100
head
, फिर tail
अंतिम 10 प्राप्त करने के लिए उपयोग करें, जैसे:head -c 20 file | tail -c 10
आप बाइट्स की मनमानी मात्रा को निकालने के लिए dd का उपयोग कर सकते हैं।
उदाहरण के लिए,
dd skip=1234 count=5 bs=1
इसके आउटपुट से इनपुट बाइट्स 1235 से 1239 तक कॉपी करेगा, और बाकी को छोड़ देगा।
मानक इनपुट से पहले पाँच बाइट्स प्राप्त करने के लिए, करें:
dd count=5 bs=1
ध्यान दें, यदि आप इनपुट फ़ाइल नाम निर्दिष्ट करना चाहते हैं, तो dd में पुराने जमाने का तर्क पार्सिंग है, इसलिए आप ऐसा करेंगे:
dd count=5 bs=1 if=filename
ध्यान दें कि dd शब्दशः घोषणा करता है कि उसने क्या किया है, इसलिए उसे दूर फेंकें, करें:
dd count=5 bs=1 2>&-
या
dd count=5 bs=1 2>/dev/null
dd bs=1
बलों को एक समय में एक ही चरित्र को पढ़ने और लिखने की आवश्यकता होती है, जो कि head
गिनती बड़ी होने की तुलना में बहुत धीमी है । यह गिनती = 5 के लिए ध्यान देने योग्य नहीं है, हालांकि।
dd
, ऐसा लगता है, यह चाल चलेगा .. चीयर्स!
head -c
करने वाले dd bs=5 count=1
दृष्टिकोण के बिना
सिर :
हेड - आउटपुट फाइल का पहला भाग
सिर [ विकल्प ] ... [ फ़ाइल ] ...
प्रत्येक FILE की पहली 10 पंक्तियों को मानक आउटपुट पर प्रिंट करें। एक से अधिक फ़ाइल के साथ, फ़ाइल नाम देने वाले शीर्षलेख के साथ प्रत्येक को पूर्ववर्ती करें। कोई फ़ाइल के साथ, या जब फ़ाइल है -, मानक इनपुट पढ़ें।
छोटे विकल्पों के लिए लंबे विकल्पों के लिए अनिवार्य तर्क अनिवार्य हैं।
-c , --bytes = [-] एन
प्रत्येक फ़ाइल के पहले एन बाइट्स प्रिंट; अग्रणी '-' के साथ, प्रत्येक फ़ाइल के अंतिम लेकिन अंतिम बाइट्स को प्रिंट करें
head -Line_number file_name | tail -1 |cut -c Num_of_chars
यह स्क्रिप्ट विशिष्ट पंक्ति और स्थान से वर्णों की सटीक संख्या देती है, जैसे:
head -5 tst.txt | tail -1 |cut -c 5-8
लाइन 5 में चार्ट देता है और लाइन 5 के 8 से 5 अंक,
नोट : tail -1
सिर द्वारा प्रदर्शित अंतिम पंक्ति का चयन करने के लिए उपयोग किया जाता है।
आप लाइन को बाहर निकाल सकते हैं और फिर इसे उदाहरण के लिए काट सकते हैं:
grep 'पाठ' फ़ाइल नाम | कट-सी 1-5
मुझे पता है कि उत्तर 6 साल पहले पूछे गए एक प्रश्न के उत्तर में है ...
लेकिन मैं कुछ घंटों से कुछ ऐसी ही तलाश कर रहा था और तब पता चला कि: कट-सी बिल्कुल ऐसा ही है, एक अतिरिक्त बोनस के साथ जो आप एक ऑफसेट भी निर्दिष्ट कर सकते हैं।
cut -c 1-5 वापस आएगा हैलो और cut -c 7-11 वापस दुनिया में आ जाएगा । किसी अन्य कमांड की आवश्यकता नहीं है
भले ही यह वर्षों पहले उत्तर / स्वीकार किया गया था, वर्तमान में स्वीकृत उत्तर केवल एक-बाइट-प्रति-वर्ण एन्कोडिंग जैसे कि iso-8859-1 के लिए, या चर-बाइट वर्ण सेट के एकल-बाइट सबसेट के लिए सही है (जैसे लैटिन वर्ण) UTF-8 के भीतर)। यहां तक कि इसके बजाय कई बाइट के अवशेषों का उपयोग करना अभी भी केवल यूटीएफ -16 जैसे फिक्स्ड-मल्टीबीट एनकोडिंग के लिए काम करेगा। यह देखते हुए कि अब UTF-8 एक सार्वभौमिक मानक होने के रास्ते पर है, और जब देशी वक्ताओं की संख्या और भाषाओं की इस सूची को देशी / माध्यमिक उपयोग द्वारा शीर्ष 30 भाषाओं की सूची में देखा जाए , तो यह महत्वपूर्ण है कि सरल चर-बाइट चरित्र-अनुकूल (बाइट-आधारित नहीं) तकनीक, चरित्र-वर्गों का उपयोग cut -c
और tr
/ के sed
साथ।
निम्नलिखित की तुलना करें जो बाइट्स बनाम वर्णों के मुद्दे (एक head
बनाम cut
, दूसरा [a-z][A-Z]
बनाम है [:upper:][:lower:]
) के बारे में दो सामान्य लैटिन-केंद्रित गलतियों / अनुमानों के कारण दोगुना विफल रहता है :
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
इस (: FreeBSD पर इस काम ठीक है, लेकिन दोनों टिप्पणी करने के लिए cut
और tr
यूनानी जीएनयू / लिनक्स पर मुझे हालांकि के लिए UTF-8 में अभी भी घायल):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
एक और हालिया उत्तर ने पहले ही "कट" का प्रस्ताव दिया था, लेकिन केवल उस पक्ष के मुद्दे के कारण जिसका उपयोग मनमाने ढंग से ऑफसेट को निर्दिष्ट करने के लिए किया जा सकता है, न कि सीधे प्रासंगिक चरित्र बनाम बाइट्स मुद्दे के कारण।
यदि आपका चर-बाइट एन्कोडिंग को सही ढंग से cut
नहीं संभालता -c
है, तो "पहले X
अक्षर" ( X
आपके नंबर के साथ बदलें ) के लिए आप कोशिश कर सकते हैं:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- जो हालांकि पहली पंक्ति तक ही सीमित हैhead -n 1 | grep -E -o '^.{X}'
- जो पहली पंक्ति तक सीमित है और यद्यपि दो आदेशों को जंजीरdd
- जो पहले से ही अन्य उत्तरों में सुझाया गया है, लेकिन वास्तव में बोझिल हैsed
कई पंक्तियों में फैले हुए पात्रों को संभालने के लिए खिड़की के बफर के साथ एक जटिल स्क्रिप्ट, लेकिन यह शायद कुछ अधिक उपयोग करने की तुलना में अधिक बोझिल / नाजुक हैdd
यदि आपका tr
वर्ण वर्ण-वर्गों को चर-बाइट एन्कोडिंग के साथ सही ढंग से नहीं संभालता है, तो आप कोशिश कर सकते हैं:
sed -E -e 's/[[:upper:]]/\L&/g
(जीएनयू विशेष)printf 'Πού ' | cut -c 1
बस
यहां dd
बताए गए दृष्टिकोण का उपयोग करते हुए एक सरल स्क्रिप्ट है :
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
भी खाता है" world\n"
जो हमेशा के लिए खो जाता है।