যদি আমার একটি কমান্ড (একক লাইন) থেকে সত্যই দীর্ঘ আউটপুট থাকে তবে আমি জানি আমি কেবল আউটপুটটির প্রথম [x] (8 টি) অক্ষর চাই, তা পাওয়ার সহজতম উপায় কী? কোনও সীমানা প্রদানকারী নেই।
যদি আমার একটি কমান্ড (একক লাইন) থেকে সত্যই দীর্ঘ আউটপুট থাকে তবে আমি জানি আমি কেবল আউটপুটটির প্রথম [x] (8 টি) অক্ষর চাই, তা পাওয়ার সহজতম উপায় কী? কোনও সীমানা প্রদানকারী নেই।
উত্তর:
একটি উপায় ব্যবহার cut
:
command | cut -c1-8
এটি আপনাকে আউটপুট প্রতিটি লাইন প্রথম 8 টি অক্ষর দেবে। যেহেতু cut
পসিক্সের অংশ তাই এটি বেশিরভাগ ইউনিয়নেই থাকতে পারে।
cut -c
অক্ষর নির্বাচন; cut -b
বা head -c
বাইট নির্বাচন করুন। এটি কিছু লোকেলগুলিতে একটি পার্থক্য তৈরি করে (অনুশীলনে, যখন ইউটিএফ -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/'
অথবা যদি আপনার sed এটা সমর্থন করে: command | sed -r 's/(.{8}).*/\1/'
; অন্যথায়, +1
head -c
গণনা করে তা নোট করুন । একইভাবে, মুখ্য Awk বাস্তবায়নগুলির মধ্যে, কেবলমাত্র জিএনইউ অ্যাওকগুলি মাল্টি-বাইট অক্ষরগুলি সঠিকভাবে পরিচালনা করে - ফ্রিবিএসডি আউক এবং মওক না।
আপনার যদি পর্যাপ্ত উন্নত শেল থাকে (উদাহরণস্বরূপ, নীচে বাশে কাজ করবে, ড্যাশ সম্পর্কে নিশ্চিত নয়), আপনি এটি করতে পারেন:
read -n8 -d$'\0' -r <(command)
নির্বাহ করার পর read ... <(command)
, আপনার অক্ষর শেল পরিবর্তনশীল থাকবে REPLY
। help read
অন্যান্য বিকল্প সম্পর্কে জানতে টাইপ করুন।
ব্যাখ্যা: -n8
যুক্তিটি read
বলতে যে আমরা 8 টি পর্যন্ত অক্ষর চাই। দ্য -d$'\0'
একটি নাল পর্যন্ত বদলে একটি newline পড়া বলেছেন। পূর্ববর্তী অক্ষরগুলির একটি নিউলাইন হলেও এটি পড়তে 8 টি অক্ষরের জন্য চলতে থাকবে (তবে এটি যদি নাল হয় না)। বিকল্প -n8 -d$'\0'
হিসাবে ব্যবহার করা হয় -N8
যা 8 টি অক্ষরের জন্য বা স্টিডিন ইওএফ পৌঁছানো অবধি পড়বে। কোন সীমানা সম্মানিত হয় না। যে সম্ভবত আপনার চাহিদা ভাল ফিট করে, কিন্তু আমি জানি না চট করে কত শাঁস একটি পঠিত সম্মান আছে -N
যেমন সম্মানিত বিরোধিতা -n
এবং -d
। ব্যাখ্যার সাথে অব্যাহত রেখেছেন : অ্যাডকেপ- -r
উপেক্ষা \
করুন, যাতে উদাহরণস্বরূপ, আমরা \\
একক হিসাবে না বরং দুটি চরিত্র হিসাবে বিবেচনা করি \
।
পরিশেষে, আমরা দ্বিতীয় ফর্মের read ... <(command)
পরিবর্তে command | read ...
এটি করি, পঠনটি একটি সাবশেলের মাধ্যমে কার্যকর করা হয় যা তত্ক্ষণাত্ প্রস্থান করা হয়, আপনি সুনির্দিষ্টভাবে পড়া তথ্য হারিয়ে ফেলে losing
আরেকটি বিকল্প হ'ল সাব-শেলের ভিতরে আপনার সমস্ত প্রক্রিয়াজাতকরণ করা। উদাহরণ স্বরূপ:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
।
read -n <num>
; ছোট সতর্কতা: বাশ 3.x (এখনও ওএসে বর্তমান) ভুল করে বাইট গণনা <num>
হিসাবে ব্যাখ্যা করে এবং এইভাবে বহু-বাইট অক্ষরগুলি ব্যর্থ হয়; এটি বাশ ৪.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'