यदि मेरे पास वास्तव में एक कमांड (सिंगल लाइन) से लंबा आउटपुट है, लेकिन मुझे पता है कि मैं केवल पहला [x] (आउटपुट के 8) अक्षर बताता हूं, तो इसे प्राप्त करने का सबसे आसान तरीका क्या है? कोई भी सीमांकक नहीं हैं।
यदि मेरे पास वास्तव में एक कमांड (सिंगल लाइन) से लंबा आउटपुट है, लेकिन मुझे पता है कि मैं केवल पहला [x] (आउटपुट के 8) अक्षर बताता हूं, तो इसे प्राप्त करने का सबसे आसान तरीका क्या है? कोई भी सीमांकक नहीं हैं।
जवाबों:
उपयोग करने का एक तरीका है cut
:
command | cut -c1-8
यह आपको आउटपुट की प्रत्येक पंक्ति के पहले 8 अक्षर देगा। चूंकि cut
यह POSIX का हिस्सा है, इसलिए यह अधिकांश यूनियनों पर होने की संभावना है।
cut -c
पात्रों का चयन करता है; cut -b
या head -c
बाइट्स का चयन करता है। यह कुछ स्थानों (व्यवहार में, UTF-8 का उपयोग करते समय) में अंतर करता है।
cut -c-8
को चरित्र 1 से 8. का चयन करेगा
cut
विंडोज पर बराबर है?
command | dd bs=8 count=1 2>/dev/null
। यह छोटा या श्रेष्ठ नहीं है। बस एक और विकल्प।
cut
, cut -c
की तरह काम करता cut -b
(जो है, यह बहु बाइट वर्णों के लिए ठीक से काम नहीं करता है)।
ये केवल 8 अक्षर पाने के कुछ अन्य तरीके हैं।
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
और अगर आपके पास बैश है
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
या यदि आपका सेड इसे सपोर्ट करता है command | sed -r 's/(.{8}).*/\1/'
:; अन्यथा, +1
head -c
गिना जाता है , वर्ण नहीं। इसी प्रकार, प्रमुख Awk कार्यान्वयन के बीच, केवल GNU awk मल्टी-बाइट वर्णों को सही ढंग से संभालता है - FreeBSD Awk और Mawk नहीं।
यदि आपके पास पर्याप्त उन्नत शेल है (उदाहरण के लिए, निम्नलिखित बाश में काम करेगा, डैश के बारे में निश्चित नहीं है), तो आप कर सकते हैं:
read -n8 -d$'\0' -r <(command)
निष्पादित करने के बाद read ... <(command)
, आपके वर्ण शेल चर में होंगे REPLY
। help 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>
cut
।
read -n <num>
; छोटे कैवेट: बैश 3.x (अभी भी ओएस पर चालू) गलती से बाइट काउंट के <num>
रूप में व्याख्या करता है और इस तरह मल्टी-बाइट पात्रों के साथ विफल हो जाता है; यह बाश 4.x में तय किया गया है।
पैरामीटर विस्तार का उपयोग करके एक और एक लाइनर समाधान
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}
पूर्णांक को हार्ड-कोडिंग के बजाय।
यह पोर्टेबल है:
a="$(command)" # Get the output of the command.
b="????" # as many ? as characters are needed.
echo ${a%"${a#${b}}"} # select that many chars from $a
वर्णों की लंबाई की एक स्ट्रिंग बनाने के लिए यहां अपना प्रश्न है ।
मुझे यह समस्या तब हुई जब मैवेन रिपॉजिटरी में मैन्युअल रूप से चेकसम फाइल्स जनरेट करना। दुर्भाग्य से cut -c
हमेशा आउटपुट के अंत में एक नई रेखा प्रिंट करता है। मेरे द्वारा उपयोग किए जाने वाले को दबाने के लिए xxd
:
command | xxd -l$BYTES | xxd -r
यह बिल्कुल $BYTES
बाइट्स का command
उत्पादन करता है , जब तक कि आउटपुट छोटा नहीं होता, तब तक यह आउटपुट ठीक नहीं होता।
cut
नई अनुगामी नई लाइन को | tr -d '\n'