एक पाइप से एक स्ट्रिंग के लिए पहले [x] वर्णों को हथियाना


58

यदि मेरे पास वास्तव में एक कमांड (सिंगल लाइन) से लंबा आउटपुट है, लेकिन मुझे पता है कि मैं केवल पहला [x] (आउटपुट के 8) अक्षर बताता हूं, तो इसे प्राप्त करने का सबसे आसान तरीका क्या है? कोई भी सीमांकक नहीं हैं।


जवाबों:


82

उपयोग करने का एक तरीका है cut:

 command | cut -c1-8

यह आपको आउटपुट की प्रत्येक पंक्ति के पहले 8 अक्षर देगा। चूंकि cutयह POSIX का हिस्सा है, इसलिए यह अधिकांश यूनियनों पर होने की संभावना है।


3
ध्यान दें कि cut -cपात्रों का चयन करता है; cut -bया head -cबाइट्स का चयन करता है। यह कुछ स्थानों (व्यवहार में, UTF-8 का उपयोग करते समय) में अंतर करता है।
गाइल्स का SO- बुराई पर रोक '22

आपको इस मामले में स्टार्ट इंडेक्स भी निर्दिष्ट करने की आवश्यकता नहीं है। कहने cut -c-8को चरित्र 1 से 8. का चयन करेगा
स्पार्कवाक

@Steven, cutविंडोज पर बराबर है?
पचेरियर

इसके अलावा command | dd bs=8 count=1 2>/dev/null। यह छोटा या श्रेष्ठ नहीं है। बस एक और विकल्प।
संदिग्ध

@Gilles, लेकिन ध्यान दें कि जीएनयू के वर्तमान संस्करण के साथ cut, cut -cकी तरह काम करता cut -b(जो है, यह बहु बाइट वर्णों के लिए ठीक से काम नहीं करता है)।
स्टीफन चेज़लस

24

ये केवल 8 अक्षर पाने के कुछ अन्य तरीके हैं।

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

और अगर आपके पास बैश है

var=$(command)
echo ${var:0:8}

2
मुझे लगता है कि निम्नलिखित सेड फॉर्मूलेशन को पढ़ना थोड़ा आसान है: command | sed 's/\(.\{8\}\).*/\1/'या यदि आपका सेड इसे सपोर्ट करता है command | sed -r 's/(.{8}).*/\1/':; अन्यथा, +1
स्टीवन डी

अच्छा सामान, लेकिन ध्यान दें कि बाइट्सhead -c गिना जाता है , वर्ण नहीं। इसी प्रकार, प्रमुख Awk कार्यान्वयन के बीच, केवल GNU awk मल्टी-बाइट वर्णों को सही ढंग से संभालता है - FreeBSD Awk और Mawk नहीं।
17

2

यदि आपके पास पर्याप्त उन्नत शेल है (उदाहरण के लिए, निम्नलिखित बाश में काम करेगा, डैश के बारे में निश्चित नहीं है), तो आप कर सकते हैं:

read -n8 -d$'\0' -r <(command)

निष्पादित करने के बाद read ... <(command), आपके वर्ण शेल चर में होंगे REPLYhelp readअन्य विकल्पों के बारे में जानने के लिए टाइप करें।

स्पष्टीकरण: यह कहने का -n8तर्क readकि हम अधिकतम 8 वर्ण चाहते हैं। -d$'\0'एक अशक्त जब तक है, बजाय एक नई पंक्ति को पढ़ने के लिए कहते हैं। इस तरह से 8 वर्णों के लिए रीड जारी रहेगा भले ही पहले के पात्रों में से एक एक नई पंक्ति है (लेकिन यदि यह अशक्त नहीं है)। इसका -n8 -d$'\0'उपयोग करने के लिए एक विकल्प है -N8, जो ठीक 8 वर्णों तक पढ़ता है या जब तक स्टड ईओएफ तक नहीं पहुंचता है। कोई भी परिसीमन सम्मानित नहीं किया जाता है। यह शायद आपकी आवश्यकताओं को बेहतर ढंग से फिट करता है, लेकिन मैं यह नहीं जानता कि कितने गोले एक रीड है जो सम्मान -Nके विपरीत सम्मान करते हैं -nऔर -d। स्पष्टीकरण के साथ जारी रखना: -rउपेक्षा- \दृष्टिकोण कहता है , इसलिए, उदाहरण के लिए, हम \\एक ही के बजाय दो वर्णों के रूप में व्यवहार करते हैं \

अंत में, हम इसके read ... <(command)बजाय करते हैं command | read ...क्योंकि दूसरे रूप में, पठन को एक उपधारा में निष्पादित किया जाता है जो तब तुरंत बाहर निकल जाता है, जो आपके द्वारा पढ़ी गई जानकारी को खो देता है।

एक अन्य विकल्प यह है कि आप अपने सभी प्रोसेसिंग सबस्क्रिप्शन के अंदर करें। उदाहरण के लिए:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>

1
यदि आप सिर्फ 8 वर्णों का उत्पादन करना चाहते हैं, और उन्हें शेल में संसाधित करने की आवश्यकता नहीं है, तो बस उपयोग करें cut
डबियसजिम 14

के बारे में जानना अच्छा है read -n <num>; छोटे कैवेट: बैश 3.x (अभी भी ओएस पर चालू) गलती से बाइट काउंट के <num>रूप में व्याख्या करता है और इस तरह मल्टी-बाइट पात्रों के साथ विफल हो जाता है; यह बाश 4.x में तय किया गया है।
mklement0

यह एक महान और उपयोगी उत्तर है। दूसरों की तुलना में बहुत अधिक सामान्य।
not2qubit

2

पैरामीटर विस्तार का उपयोग करके एक और एक लाइनर समाधान

echo ${word:0:x}

EG: word="Hello world"
echo ${word:0:3} or echo ${word::3} 
o/p: Hel


EG.2: word="Hello world"
echo ${word:1:3}
o/p: ell

आप लंबाई को पकड़े हुए एक चर का उपयोग भी कर सकते हैं, जैसे: x=8; echo ${word:0:$x}पूर्णांक को हार्ड-कोडिंग के बजाय।
कोमेट्सॉन्ग


0

मुझे यह समस्या तब हुई जब मैवेन रिपॉजिटरी में मैन्युअल रूप से चेकसम फाइल्स जनरेट करना। दुर्भाग्य से cut -cहमेशा आउटपुट के अंत में एक नई रेखा प्रिंट करता है। मेरे द्वारा उपयोग किए जाने वाले को दबाने के लिए xxd:

command | xxd -l$BYTES | xxd -r

यह बिल्कुल $BYTESबाइट्स का commandउत्पादन करता है , जब तक कि आउटपुट छोटा नहीं होता, तब तक यह आउटपुट ठीक नहीं होता।


एक और तरीका है cutनई अनुगामी नई लाइन को | tr -d '\n'
उतारना है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.