বাশগুলিতে স্ট্রাউট লাইনের প্রস্থকে ডায়নামিকালি ট্রিম করুন


9

ইদানীং, আমি psকমান্ডটি নিয়ে পরীক্ষা-নিরীক্ষা করে চলেছি এবং কখনও কখনও লম্বা পথগুলি পরের লাইনে (বা দুটি) মোড়ানো হয় এবং এটি পড়া শক্ত করে তোলে। আমি psআউটপুটটিকে xঅক্ষরের সংখ্যায় সীমাবদ্ধ করতে অন্য প্রোগ্রামে পাইপ করতে চাই ।

আমার এখন অবধি যা আছে তা এখানে, তবে এটি ঠিকভাবে কাজ করে না:

ps aux | cut -c1-$(stty size | cut -d' ' -f2)

$(stty size | cut -d' ' -f2)167 এ মূল্যায়ন করে তবে এটির জন্য বৈধ ইনপুট বলে মনে হচ্ছে না cut

ব্যাশে কাজ করার জন্য এই জাতীয় সিনট্যাক্স পাওয়ার কোনও উপায় আছে কি?


আমার জন্য এই কাজ। আপনি কিছু আউটপুট প্রদান করতে পারেন?
cuonglm

গতিশীল অংশটি কোথায়? আপনি কিছু শর্তের জন্য আলাদা দৈর্ঘ্য চান? দেখে মনে হচ্ছে আপনি সমস্ত আউটপুটকে একটি সর্বাধিক দৈর্ঘ্যে সীমাবদ্ধ করতে চান

@awk_FTW পরিস্থিতি অনুসারে আমার বিভিন্ন উইন্ডো সেটিংস রয়েছে। ফুলস্ক্রিনে, আমার প্রস্থটি 167 But তবে অন্যান্য আকারে আমার আরও ছোট হওয়া দরকার। সে কারণেই আমি আকার পেতে স্টেস্টিকে কল করতে চাই।
মসুর ডাল 4

চেষ্টা করুনtput rmam; ps aux
স্টাফেন চেজেলাস

কিছু শাঁস পছন্দ zsh, ksh93বা bashটার্মিনাল প্রস্থ সংরক্ষণ$COLUMNS
Stéphane Chazelas

উত্তর:


5

নিম্নলিখিত কাজগুলি:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

এটিও কাজ করে:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

সমস্যাটি মনে হচ্ছে যে sttyএটি কার্য করতে তার স্ট্যান্ডার্ড ইনপুটটিতে tty থাকা দরকার। উপরের দুটি পন্থা এটি সমাধান করে।

আরও একটি বিকল্প আছে। যদিও sttyএখনও একটি টার্মিনাল পয়েন্ট এটা: এর stdin এবং stdout- এ উভয় উপরে আদেশগুলিতে পুনঃনির্দেশিত করা হয়, তার দ্বারা stderr নয়। আশ্চর্যজনকভাবে যথেষ্ট, sttyএটির স্ট্যান্ডারকে যদি এর ইনপুট হিসাবে দেওয়া হয় তবে তাও কাজ করবে:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)

আসলে, এটা না! এটি ঠিক আমি যা খুঁজছিলাম ছিল। শুধু কৌতূহলী, আপনি টি-টিটি শেষে কেন যুক্ত করলেন?
মসুর ডাল 4

@ ল্যান্টিলস ওফস, teeআমি ডিবাগ করার সময় যুক্ত হয়েছিল the এখন চলে গেছে।
1024

<& 2 কী বোঝায়? সেই স্বরলিপি আমি আগে কখনও দেখিনি।
মসুর ডাল

@ অ্যান্টিলস শেলটিতে ফাইলগুলি নম্বরযুক্ত রয়েছে জিরো স্ট্যান্ডার্ড ইনপুট, এক থেকে স্ট্যান্ডার্ড আউটপুট এবং দুটি থেকে স্ট্যান্ডার্ড ত্রুটি বোঝায়। এক্সপ্রেশন <&2মানে স্ট্যান্ডার্ড ত্রুটি থেকে আপনার ইনপুট পান।
1024

1
sttyটার্মিনালের সেটিংসটি তার স্টিডিনে খোলে ( stty < /dev/other-ttyউদাহরণস্বরূপ আপনি অন্য টার্মিনালের সেটিংস পেতে পারেন)। সুতরাং এটি আশ্চর্যজনক নয় যে এর স্টিডিনটি পাইপ বা এটি কাজ করলে এটি কাজ করবে না <&2
স্টাফেন চেজেলাস

8

কিছু শাঁস পছন্দ zsh, bashবা mkshস্বয়ংক্রিয়ভাবে সেট $COLUMNSযাতে আপনি ডাকা প্রয়োজন হবে না, টার্মিনাল প্রস্থ পরিবর্তনশীল sttyএখানে।

psআমি সমস্ত প্রয়োগগুলি চেষ্টা করেছিলাম যে নন-স্ট্যান্ডার্ড (বিএসডি-টাইপ) সিনট্যাক্সটি নিজেরাই টার্মিনালের প্রস্থকে জিজ্ঞাসা করে। আমি অবাক হয়েছি তোমার তা হয় না। আমি আশা করি এটি যদিও COLUMNS পরিবেশের পরিবর্তনশীল বিষয়বস্তুটি দেখবে ।

সুতরাং আপনি করতে পারেন:

export COLUMNS; ps aux

যদি না,

ps aux | cut -c"1-$COLUMNS"

আপনি আপনার টার্মিনালটি লাইন মোড়ানো না করতেও বলতে পারেন:

tput rmam
ps aux

4

আপনি psআউটপুটটি আরও ভালভাবে পরিচালনা করতে পারেন ।

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

এটি psপ্রয়োজনীয়তার সাথে আপনার স্পেসিফিকেশনে এর আউটপুট পার্স করতে বলবে ।

অবশ্যই, যদি আপনি শব্দ মোড়ানো না করেন, তবে, তবে আপনার কাছে তথ্য হারিয়ে যাওয়ার সমস্যা রয়েছে। আপনার সমস্ত প্রক্রিয়াটির জন্য সত্যই কি এটি দরকার? যদি এটি হয় তবে এটি একটি পেজারে খুলুন:

ps ww ${opts} | $PAGER

যদি তা না হয় তবে আপনি যা দেখতে চান তা উল্লেখ করুন:

ps -o args= -p $pid

বিকল্পভাবে আপনি psআপনার টার্মিনালটি স্পষ্টভাবে জানাতে পারেন --width:

man ps

...

w প্রশস্ত আউটপুট। সীমাহীন প্রস্থের জন্য এই বিকল্পটি দু'বার ব্যবহার করুন।

-w প্রশস্ত আউটপুট। সীমাহীন প্রস্থের জন্য এই বিকল্পটি দু'বার ব্যবহার করুন।

--width n স্ক্রিন প্রস্থ সেট করুন।

--widthজিনিস কোন অতিরিক্ত ফিল্টার বা আনুষঙ্গিক প্রক্রিয়া জড়িত না করেও আপনার অনুরোধ চশমা ঠিক কাজ করে (যা সম্ভবত শুধুমাত্র আপনার বিশৃঙ্খল হবে -auxআরও বেশি আউটপুট)। এবং $COLUMNSউপরে প্রদর্শিত হিসাবে এবং স্টিফেন পয়েন্ট হিসাবে এটি এমনকি গতিশীল কাজ করবে।

এটা সম্ভবত এর মূল্য যদিও, আমি দেখি যে মানুষ প্রায়ই তাই তারা একটি অন্তর্ভুক্ত করতে অপ্রয়োজনীয় ফিল্টার এই ধরনের যোগ করার জন্য চেষ্টা |pipeমাধ্যমে অন্য পার্স আউটপুট ফিল্টার যা প্রশংসনীয় অপ্রয়োজনীয় হতে পারে। অবশ্যই, লোকদের দ্বারা আমি বেশিরভাগই আমাকে বোঝায়

-oUtput প্রতীক আমি উপরের যা কলাম ফিল্টার আপনি করতে পারবেন উল্লেখ psপ্রদর্শন, এবং যখন আপনি যোগ =assigment আপনি এমনকি আপনি কলামের নামের করতে দয়া করে। আমি অ্যাসাইনমেন্টটি খালি রেখে এটিকে একটি টার্গেট -pরোস হাতে দিচ্ছি $pidযাতে একেবারে একমাত্র আউটপুট psহ'ল $pidকমান্ডের নাম এবং এটির অনুরোধে args। এবং -oসবে কীভাবে আপনি কী সংজ্ঞা psদেবেন বা কী প্রদর্শিত হবে না তা আপনি কীভাবে সংজ্ঞায়িত করতে পারেন তার তল সবে স্ক্র্যাচ করে । এই দিকটিই আমি আপনাকে গ্রহণ করার পরামর্শ দিচ্ছি, বিশেষত:

man ps

... 

বিএসডি সিনট্যাক্স ব্যবহার করে সিস্টেমে প্রতিটি প্রক্রিয়া দেখতে:

ps ax

ps axu

একটি প্রক্রিয়া ট্রি মুদ্রণ করতে:

ps -ejH

ps axjf

থ্রেড সম্পর্কে তথ্য পেতে:

ps -eLf

ps axms

সুরক্ষা সম্পর্কিত তথ্য পেতে:

ps -eo euser,ruser,suser,fuser,f,comm,label

ps axZ

ps -eM

ব্যবহারকারীর ফর্ম্যাটে প্রতিটি প্রক্রিয়া রুট (বাস্তব এবং কার্যকর আইডি) হিসাবে চলমান দেখতে:

ps -U root -u root u

ব্যবহারকারী-সংজ্ঞায়িত ফর্ম্যাট সহ প্রতিটি প্রক্রিয়া দেখতে:

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps -Ao pid,tt,user,fname,tmout,f,wchan

সিসলোগডের কেবলমাত্র প্রসেস আইডি মুদ্রণ করুন:

ps -C syslogd -o pid=

কেবল পিআইডি 42 এর নাম মুদ্রণ করুন:

ps -p 42 -o comm=

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.