বাশ শেল স্ক্রিপ্ট আউটপুট প্রান্তিককরণ


29

আমার লিপি:

date
echo -e "${YELLOW}Network check${NC}\n\n"

while read hostname
do

ping -c 1 "$hostname" > /dev/null 2>&1 &&

echo -e "Network $hostname : ${GREEN}Online${NC}" ||
echo -e "${GRAY}Network $hostname${NC} : ${RED}Offline${NC}"

done < list.txt
        sleep 30
clear
done

এইভাবে তথ্য আউটপুট দিচ্ছে:

Network 10.x.xx.xxx : Online   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.x : Online   
Network 139.xxx.x.x : Online   
Network 208.xx.xxx.xxx : Online   
Network 193.xxx.xxx.x : Online

যা আমি এই জাতীয় কিছু পেতে পরিষ্কার করতে চাই:

Network 10.x.xx.xxx       : Online  
Network 10.x.xx.xxx       : Offline   
Network 10.x.xx.xxx       : Offline    
Network 10.x.xx.x         : Online    
Network 139.xxx.x.x       : Online  
Network 208.xx.xxx.xxx    : Online    
Network 193.xxx.xxx.x     : Online  
Network 193.xxx.xxx.xxx   : Offline

উত্তর:


45

printfআউটপুট ফর্ম্যাট করতে ব্যবহার করুন (এটি এর চেয়ে আরও বেশি বহনযোগ্যecho )। আমি রঙ ফেলা সিকোয়েন্সগুলির আসল মানটি এমন আকারে সংরক্ষণের পরিবর্তে সঞ্চয় করতে চাই যার দ্বারা প্রসারিত হওয়া দরকার echo

RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0) 
online="${GREEN}online$NC" offline="${RED}offline$NC"

ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"

%-15sএকটি বিন্যাসে স্পেসিফিকেশন প্যাড দৈর্ঘ্য ডানে তাই ব্যবধান সহ স্ট্রিং (অক্ষরের সংখ্যা যে হয় zshএবং fishএবং অন্যান্য অধিকাংশ শাঁস / printf, বাইট ) অন্তত 15 যাবে।

$ printf '|%-4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcde|
 printf '|%4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcde|

ছাঁটাই সহ:

$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcd|

কলামগুলিতে পাঠ্য বিন্যাস করতে অন্যান্য ইউটিলিটিগুলির মধ্যে পসআইএক্সexpand অন্তর্ভুক্ত রয়েছে :

printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30

(এখানে ট্যাব অক্ষরটি প্রসারিত করে \t) ট্যাবটি প্রতি 30 টি কলাম থামিয়ে দেয়)

বা বিএসডিcolumn বা পসিক্সpr :

printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2

(এখানে 2 36-কলামের প্রশস্ত কলামগুলিতে আউটপুট আউট হচ্ছে ( -w72 এর ডিফল্ট থেকে পৃষ্ঠার প্রস্থ পরিবর্তন করার বিকল্প দেখুন ))।

বা বিএসডিrs :

{
   while...
      printf 'Network %s\n: %s\n' "$hostname" "$state"
   done
} | rs -e 0 2

(যেমনটি columnসমস্ত ইনপুট না পড়া পর্যন্ত আউটপুট করা শুরু করবে না)।

বা জিএনইউcolumns :

printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2

zsh: এছাড়াও স্ট্রিং প্যাডিং জন্য কিছু প্যারামিটার সম্প্রসারণ পতাকা হয়েছে ${(l:15:)hostname}জন্য বাম প্যাডিং এবং ${(r:15:)hostname}জন্য ডান প্যাডিং থাকবে না (ছাঁটাই সহ)। ইন প্রম্পট সম্প্রসারণ (অনুরোধ জানানো অথবা মত print -Pঅথবা সঙ্গে প্যারামিটার প্রসারণও সক্রিয় %পতাকা), এটি সমর্থন %F{green}রঙ আউটপুট, তাই আপনি করতে পারেন:

online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"

বা:

print -rP "Network ${(r:15:)hostname}: $online"

যদিও এর লিখিত সামগ্রী $hostnameতত্ক্ষণাত প্রসারণের সাপেক্ষে হতে পারে, যা আপনার কন্টেন্টের $hostnameনিয়ন্ত্রণে না থাকলে কমান্ড ইঞ্জেকশন দুর্বলতা তৈরি করে (এর মতো hostname='%<a[`reboot`]<')


35

কেবল columnকমান্ড সহ:

yourscript.sh | column -t

আউটপুট:

Network  10.x.xx.xxx     :  Online
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.x       :  Online
Network  139.xxx.x.x     :  Online
Network  208.xx.xxx.xxx  :  Online
Network  193.xxx.xxx.x   :  Online

আমি বোকা প্রশ্নের জন্য দুঃখিত, তবে আমার সেই আদেশটি কোথায় রাখা উচিত?
pijaaa

@ পাইজা, আমার আপডেট দেখুন, আপনার স্ক্রিপ্ট আউটপুট দিয়ে পাইপ করুন
রোমানপেরেখারেস্ট

10
মনে রাখবেন যে column(একটি BSD কমান্ড, লিনাক্সে পোর্ট করে এবং কিছু বিতরণে ডিফল্টরূপে পাওয়া যায়, GNU এর সাথে বিভ্রান্ত হওয়ার columnsদরকার নেই) কিছু আউটপুট শুরু করার আগে পুরো ইনপুটটি পড়তে হবে কারণ এটি ভিত্তিক কলামগুলির প্রস্থ গণনা করতে হবে প্রস্থ উপর।
স্টাফেন চেজেলাস

3

\tযেখানে আপনি কোনও কলামে ট্যাব আউট করতে চান সেখানে (ট্যাবগুলিতে) একটি সেট নম্বর সন্নিবেশ করতে আপনার স্ক্রিপ্টটি আপডেট করুন ।

নীচের সাথে সিমুলার কিছু আউটপুট আপনাকে প্রয়োজনীয় প্রান্তিককরণ দেয়:

Network 10.x.xx.xxx\t: Online   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.x\t: Online   
Network 139.xxx.x.x\t: Online   
Network 208.xx.xxx.xxx\t: Online   
Network 193.xxx.xxx.x\t: Online

3
প্রশ্নের স্ক্রিপ্টের উপর ভিত্তি করে একটি সংক্ষিপ্ত উদাহরণ যোগ করা উচিত ...
স্টিফেন কিট

@ স্টেফেনকিট টি স্টিফেন, আমি কীভাবে এটি কেবলমাত্র এক লাইনের চেয়ে আরও বেশি তৈরি করতে পারি তা চেষ্টা করার চেষ্টা করছিলাম এবং সত্যই আমার কাছে তা ঘটেনি!
djsmiley2k - CoW

3
আপনি লক্ষ্য করুন যে প্রতি 8 টি কলামে ডিফল্ট ট্যাবস্টপগুলি printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123সঠিকভাবে সারিবদ্ধ হয় না। expandআমার উত্তরে যেমন দেখানো হয়েছে তেমন কোনও ট্যাব স্টপ দিয়ে ট্যাবগুলি প্রসারিত করে আপনি তার চারপাশে কাজ করতে পারেন ।
স্টাফেন চেজেলাস

টিক আইকনটি ক্লিক করে দয়া করে এটিকে উত্তর হিসাবে নির্দ্বিধায় গ্রহণ করুন।
djsmiley2k - CoW

0

@ রোমানের থেকেও আরও ভাল প্রদর্শন করতে

yourscript.sh | column -t -s $'\t'

তারপরে \tকলামে বিভক্ত করতে প্রতিটি লাইনে যুক্ত করুন ।

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