বিশেষ ফরম্যাটে মুদ্রণের জন্য বাশ + প্রিন্টফ ব্যবহার করে


12

লিনাক্স মেশিনের তালিকার পিং অ্যাক্সেস পরীক্ষা করতে আমি কেবল নীচের বাশ স্ক্রিপ্ট লিখেছি:

for M in $list
 do
   ping -q -c 1  "$M" >/dev/null 
          if [[ $? -eq 0 ]]
   then
    echo "($C) $MACHINE CONNECTION OK"
   else
    echo "($C) $MACHINE CONNECTION FAIL"
   fi

   let C=$C+1
done

এই মুদ্রণ:

 (1) linux643 CONNECTION OK
 (2) linux72 CONNECTION OK
 (3) linux862 CONNECTION OK
 (4) linux12 CONNECTION OK
 (5) linux88 CONNECTION OK
 (6) Unix_machinetru64 CONNECTION OK

printfনীচের ফর্ম্যাটটি মুদ্রণের জন্য আমি কীভাবে আমার বাশ স্ক্রিপ্টে (বা অন্য কোনও কমান্ড) ব্যবহার করতে পারি ?

 (1) linux643 ............ CONNECTION OK
 (2) linux72 ............. CONNECTION OK
 (3) linux862 ............ CONNECTION OK
 (4) linux12 ............. CONNECTION OK
 (5) linux88 ............. CONNECTION FAIL
 (6) Unix_machinetru64 ... CONNECTION OK

$TOTAL (length) - $MASHINE (length)বিন্দুর সংখ্যা পেতে আপনি একটি গণনা করতে পারেন। তারপরে printf '.%.s' {1..$DOTS}প্রতিটি লুপের পুনরাবৃত্তিতে ব্যবহার করুন । এরকম কিছু আমার মনে হয় কাজ করবে।
coffeMug

দয়া করে আপনার সমাধানটিকে উত্তর হিসাবে বর্ণনা করতে পারেন
yael

আপনার ইতিমধ্যে একটি উত্তর আছে। ;-)
coffeMug

উত্তর:


19

%-sবিন্দু দ্বারা সৃষ্ট স্থানগুলি প্রতিস্থাপন করতে প্যারামিটার সম্প্রসারণ ব্যবহার করে:

#!/bin/bash
list=(localhost google.com nowhere)
C=1
for M in "${list[@]}"
do
    machine_indented=$(printf '%-20s' "$M")
    machine_indented=${machine_indented// /.}

    if ping -q -c 1  "$M" &>/dev/null ;  then
        printf "(%2d) %s CONNECTION OK\n" "$C" "$machine_indented"
    else
        printf "(%2d) %s CONNECTION FAIL\n" "$C" "$machine_indented"
    fi
    ((C=C+1))
done

বাহ, আমাকে পরীক্ষা করতে দিন এবং আমি শীঘ্রই আপডেট করব ..........................
ইয়াইল

1
হেই, চালাক! পেডেন্টিক পয়েন্টগুলির একটি দম্পতি: i) %2dপ্যারেন্থেসিসের অভ্যন্তরে একটি অযথা স্থান যুক্ত করা হচ্ছে (যদিও এটি কার্যকর হতে পারে $ list> = 10); ii) ওপির সঠিক আউটপুট পেতে , আপনি machine_indented=${machine_indented/../ .}প্রথমটির আগে অতিরিক্ত স্থান যুক্ত করতে যোগ করতে চাইতে পারেন .। আমি যেমন বলেছি, পেডেন্টিক।
টেরডন

হাই চোরোবা, আপনি দয়া করে আপনার উত্তরে টেরডোন মন্তব্য বিবেচনা করতে পারেন?
yael

@ আইয়েল: সমাধানটি টুইট করতে এখন আপনার পক্ষে সহজ হওয়া উচিত :-)
চোরোবা

বিটিডব্লিউ - কেন আগে / দেব / নাল যুক্ত করবেন?
yael

8

for m in $listহয় zshসিনট্যাক্স। ইন bashএটি হবে for i in "${list[@]}"

bashপ্যাডিং অপারেটর নেই। আপনি প্যাডিং দিয়ে printfতবে কেবল ফাঁকা জায়গায় করতে পারেন, স্বেচ্ছামূলক অক্ষর নয়। zshপ্যাডিং অপারেটর রয়েছে।

#! /bin/zsh -
list=(
  linux643
  linux72
  linux862
  linux12
  linux88
  Unix_machinetru64
)
c=0
for machine in $list; do
  if ping -q -c 1 $machine >& /dev/null; then
    state=OK
  else
    state=FAIL
  fi
  printf '%4s %s\n' "($((++c)))" "${(r:25::.:):-$machine } CONNECTION $state"
done

প্যাডিং অপারেটর ${(r:25:)parameter}থেকে ডান স্পেস সহ বা দৈর্ঘ্য 25 সঙ্গে -pad ${(r:25::string:)parameter}করার অধিকার স্থান পরিবর্তে কোন স্ট্রিং সঙ্গে -pad।

আমরা স্পেস সহ বাম- প্যাড printf '%4s'করতে ব্যবহার করি to আমরা পরিবর্তে ব্যবহার করতে পারে । যদিও একটি উল্লেখযোগ্য পার্থক্য হ'ল স্ট্রিংটি যদি 4 টির বেশি অক্ষরের দীর্ঘ হয় তবে এটি কেটে যাবে, যখন এটি প্রবাহিত হবে ।(x)${(l:4:):-"($((++c)))"}${(l)}printf


6

%sবিন্যাস উল্লেখ এই স্পষ্টতা (লাগতে পারে %.20sউদাহরণস্বরূপ), এবং ঠিক যেমন যখন আপনি আউটপুট একটি নির্দিষ্ট স্পষ্টতা করার জন্য একটি ভাসা মান (সাথে করতে চান %.4fউদাহরণস্বরূপ), আউটপুট সর্বাধিক হবে দেওয়া পংক্তি যুক্তি থেকে অনেক অক্ষর আছে যা।

সুতরাং একটি স্ট্রিং তৈরি করুন যাতে মেশিনের নাম এবং বিন্দুগুলি শেষ হওয়ার জন্য পর্যাপ্ত বিন্দু রয়েছে:

cnt=0
for hname in vboxhost ntp.stupi.se example.com nonexistant; do
   if ping -q -c 1  "$hname" >/dev/null 2>&1; then
       status="OK"
   else
       status="FAIL"
   fi

   printf "(%d) %.20s CONNECTION %s\n" \
       "$(( ++cnt ))" "$hname ...................." "$status"

done

আউটপুট:

(1) vboxhost ........... CONNECTION OK
(2) ntp.stupi.se ....... CONNECTION OK
(3) example.com ........ CONNECTION OK
(4) nonexistant ........ CONNECTION FAIL

2

@ চোরোবার উত্তর থেকে জিনিস চুরি সহ:

#!/bin/bash 
list=(linux643 linux72 google.com linux862 linux12 linux88 unix_machinetru64) 
C=1 
readonly TOTAL=50 
for M in "${list[@]}" 
do 
    DOTS=$(( TOTAL - ${#M} ))
    ping -q -c 1  "$M" &>/dev/null 

    if (($?)) ;  then 
        printf "(%d) %s" "$C" "$M" ; printf "%0.s." $(seq 1 $DOTS) ; printf " CONNECTION FAILED\n" 
    else 
        printf "(%d) %s" "$C" "$M" ; printf "%0.s." $(seq 1 $DOTS) ; printf " CONNECTION OK\n"  
    fi 
    ((C=C+1)) 
done 

2

আমি এটা করতে চাই fpingএবং awk। দুর্ভাগ্যবশত, awk'গুলি printfবিন্দু দিয়ে প্যাড পারব না, শুধুমাত্র সঙ্গে স্পেস বা শূণ্যসমূহ তাই আমি একটি ফাংশন লিখতে হবে:

list=(kali surya indra ganesh durga hanuman nonexistent)

fping "${list[@]}" 2>&1 | 
  sort -k3 |
  awk -F'[: ]' 'BEGIN { fmt="(%02d) %s CONNECTION %s\n"};

       function dotpad(s,maxlen,     l,c,pads) {
         l = maxlen - length(s);
         pads = "";
         for (c=0;c<l;c++) {pads=pads"."};
         return s " " pads
       };

       /alive$/       { printf fmt, ++i, dotpad($1,19), "OK" };
       /unreachable$/ { printf fmt, ++i, dotpad($1,19), "FAIL" }
       /not known$/   { printf fmt, ++i, dotpad($1,19), "IMPOSSIBLE" } '
(01) durga .............. CONNECTION OK
(02) ganesh ............. CONNECTION OK
(03) indra .............. CONNECTION OK
(04) kali ............... CONNECTION OK
(05) nonexistent ........ CONNECTION IMPOSSIBLE
(06) hanuman ............ CONNECTION FAIL
(07) surya .............. CONNECTION FAIL

আমি প্রথম বন্ধনীগুলিতে শূন্য-প্যাডযুক্ত 2-সংখ্যার সংখ্যা ব্যবহার করছি যাতে 10-99 হোস্ট থাকলে সেখানে ফর্ম্যাটটি $listস্ক্রু না হয়ে যায় (100+ এখনও এটি স্ক্রু করবে)। বিকল্প একটি পর্যন্ত মুদ্রণ বিলম্ব হবে END {}ব্লক, এবং / regexp-মিলের জন্য / তিন অ্যারে এক, যেমন মধ্যে মাত্র সন্নিবেশ হোস্টনাম ok, fail, unknown। বা কেবলমাত্র একটি সহযোগী অ্যারে (উদাঃ hosts[hostname]="OK")। তারপরে আপনি লাইনগুলির সংখ্যা গণনা করতে পারেন এবং লাইন-কাউন্টার ক্ষেত্রটি কত প্রশস্ত হওয়া উচিত তা স্থির করতে এটি ব্যবহার করতে পারেন।

আমি অজানা হোস্ট ( CONNECTION IMPOSSIBLE) এবং অ্যাক্সেস অযোগ্য হোস্ট ( CONNECTION FAIL) এর মধ্যে আউটপুট আলাদা করার সিদ্ধান্ত নিয়েছি ।

sort -k3ঐচ্ছিক, এটা ঠিক গ্রুপ দ্বারা আউটপুট fpingফলাফলের ( "হোস্ট-নেম জীবিত", "হোস্ট-নেম পাওয়া যাচ্ছে না" বা "হোস্টনাম: নাম বা জানা যায় না সেবা")। ছাড়া sort, অজানা হোস্টগুলি সর্বদা আউটপুটে প্রদর্শিত হবে। হোস্টনাম sortঅনুসারে -k3উইল ছাড়াই কেবল সরল ।

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