পাইপ থেকে স্ট্রিংয়ের জন্য প্রথম [x] অক্ষর আঁকড়ে নেওয়া


58

যদি আমার একটি কমান্ড (একক লাইন) থেকে সত্যই দীর্ঘ আউটপুট থাকে তবে আমি জানি আমি কেবল আউটপুটটির প্রথম [x] (8 টি) অক্ষর চাই, তা পাওয়ার সহজতম উপায় কী? কোনও সীমানা প্রদানকারী নেই।


উত্তর:


82

একটি উপায় ব্যবহার cut:

 command | cut -c1-8

এটি আপনাকে আউটপুট প্রতিটি লাইন প্রথম 8 টি অক্ষর দেবে। যেহেতু cutপসিক্সের অংশ তাই এটি বেশিরভাগ ইউনিয়নেই থাকতে পারে।


3
মনে রাখবেন যে, cut -cঅক্ষর নির্বাচন; cut -bবা head -cবাইট নির্বাচন করুন। এটি কিছু লোকেলগুলিতে একটি পার্থক্য তৈরি করে (অনুশীলনে, যখন ইউটিএফ -8 ব্যবহার করে)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

এই ক্ষেত্রে আপনাকে প্রারম্ভিক সূচকটিও নির্দিষ্ট করতে হবে না। বলছেন cut -c-81 থেকে 8 টি চরিত্র থেকে নির্বাচন করবেন
স্পারহাক

@ স্টিভেন, cutউইন্ডোজ সমান?
পেসারিয়ার

এছাড়াও command | dd bs=8 count=1 2>/dev/null। এটি সংক্ষিপ্ত বা উচ্চতর বলা হচ্ছে না। অন্য একটি বিকল্প।
dubiousjim

@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/'অথবা যদি আপনার sed এটা সমর্থন করে: command | sed -r 's/(.{8}).*/\1/'; অন্যথায়, +1
স্টিভেন ডি

ভাল জিনিস, তবে নোটগুলি নয়, বাইটhead -c গণনা করে তা নোট করুন । একইভাবে, মুখ্য Awk বাস্তবায়নগুলির মধ্যে, কেবলমাত্র জিএনইউ অ্যাওকগুলি মাল্টি-বাইট অক্ষরগুলি সঠিকভাবে পরিচালনা করে - ফ্রিবিএসডি আউক এবং মওক না।
mklement0

2

আপনার যদি পর্যাপ্ত উন্নত শেল থাকে (উদাহরণস্বরূপ, নীচে বাশে কাজ করবে, ড্যাশ সম্পর্কে নিশ্চিত নয়), আপনি এটি করতে পারেন:

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

নির্বাহ করার পর read ... <(command), আপনার অক্ষর শেল পরিবর্তনশীল থাকবে REPLYhelp 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>

1
আপনি যদি কেবল 8 টি অক্ষর আউটপুট করতে চান এবং শেলের মধ্যে তাদের প্রক্রিয়া করার প্রয়োজন না হয় তবে কেবল ব্যবহার করুন cut
dubiousjim

সম্পর্কে জেনে রাখা ভাল read -n <num>; ছোট সতর্কতা: বাশ 3.x (এখনও ওএসে বর্তমান) ভুল করে বাইট গণনা <num>হিসাবে ব্যাখ্যা করে এবং এইভাবে বহু-বাইট অক্ষরগুলি ব্যর্থ হয়; এটি বাশ ৪.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'
ট্রেলিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.