ผมจะทำมันด้วยและfping
awk
แต่น่าเสียดายที่awk
's printf
ไม่สามารถแผ่นมีจุดเท่านั้นที่มีช่องว่างหรือ zeroes ดังนั้นผมจึงต้องมีการเขียนฟังก์ชั่น:
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
จะเรียงตามชื่อโฮสต์
$TOTAL (length) - $MASHINE (length)
เพื่อให้ได้จำนวนจุด จากนั้นใช้printf '.%.s' {1..$DOTS}
ในการวนซ้ำแต่ละครั้ง อย่างนี้ฉันคิดว่าจะทำงาน