bash + विशेष प्रारूप में मुद्रित करने के लिए प्रिंटफ़ का उपयोग करना


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निम्नलिखित प्रारूप को प्रिंट करने के लिए मैं अपनी bash स्क्रिप्ट में (या किसी अन्य कमांड) का उपयोग कैसे कर सकता हूं ?

 (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

क्या आप अपना समाधान उत्तर के रूप में बता सकते हैं
येल

आपके पास पहले से ही एक उत्तर है। ;-)
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कोष्ठकों के अंदर एक अनावश्यक स्थान जोड़ रहा है (हालांकि यह $ सूची> = 10) होने पर उपयोगी हो सकता है; ii) ओपी का सटीक आउटपुट प्राप्त करने के लिए , आप machine_indented=${machine_indented/../ .}पहले से एक अतिरिक्त स्थान जोड़ना चाह सकते हैं .। जैसा कि मैंने कहा, पांडित्य।
terdon

हाय चिरोबा, क्या आप कृपया अपने उत्तर में टेर्डन टिप्पणी पर विचार कर सकते हैं?
येल

@ येल: अब आपके लिए समाधान को ट्विस्ट करना आसान होना चाहिए :-)
कोरोबा

BTW - क्यों और इससे पहले जोड़ें> / देव / अशक्त?
येल

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'करने के लिए छोड़ दिया -pad (x)रिक्तियों के साथ। हम ${(l:4:):-"($((++c)))"}इसके बजाय इस्तेमाल कर सकते थे । एक उल्लेखनीय अंतर हालांकि यह है कि अगर स्ट्रिंग 4 वर्णों से अधिक लंबी है, ${(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's 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होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.