Saya baru saja menulis skrip bash berikut untuk memeriksa akses ping pada daftar mesin Linux:
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
Ini mencetak:
(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
Bagaimana saya bisa menggunakan printf
(atau perintah lain) dalam skrip bash saya untuk mencetak format berikut?
(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
bash
shell-script
printf
yael
sumber
sumber
$TOTAL (length) - $MASHINE (length)
untuk mendapatkan jumlah titik. Kemudian gunakanprintf '.%.s' {1..$DOTS}
di setiap iterasi loop. Sesuatu seperti ini saya pikir akan berhasil.Jawaban:
Menggunakan ekspansi parameter untuk mengganti spasi yang dihasilkan
%-s
oleh titik:sumber
%2d
menambahkan ruang yang tidak perlu di dalam tanda kurung (walaupun mungkin berguna ketika $ list> = 10); ii) untuk mendapatkan output OP yang tepat , Anda mungkin ingin menambahkanmachine_indented=${machine_indented/../ .}
untuk menambah ruang sebelum yang pertama.
. Seperti yang saya katakan, pedantic.for m in $list
adalahzsh
sintaks. Dibash
dalamnya akanfor i in "${list[@]}"
.bash
tidak memiliki operator padding. Anda dapat melakukan padding denganprintf
tetapi hanya dengan spasi, bukan karakter yang arbitrer.zsh
memiliki operator padding.The Padding operator adalah
${(r:25:)parameter}
untuk benar -pad dengan panjang 25 dengan spasi atau${(r:25::string:)parameter}
ke kanan -pad dengan string bukannya ruang.Kami juga menggunakan
printf '%4s'
untuk -pad kiri(x)
dengan spasi. Kita bisa menggunakannya${(l:4:):-"($((++c)))"}
sebagai gantinya. Perbedaan yang mencolok adalah bahwa jika string lebih dari 4 karakter,${(l)}
akan memotongnya, sementara itu akan meluap bersamaprintf
.sumber
Penentu
%s
format dapat mengambil presisi (%.20s
misalnya), dan sama seperti ketika Anda ingin menampilkan nilai float ke presisi tertentu (dengan%.4f
misalnya), output akan paling banyak karakter dari argumen string yang diberikan.Jadi buat string yang berisi nama mesin dan cukup titik untuk kehabisan titik:
Keluaran:
sumber
Dengan barang-barang yang dicuri dari jawaban @ choroba:
sumber
Saya akan melakukannya dengan
fping
danawk
. Sayangnya,awk
ituprintf
tidak bisa pad dengan titik, hanya dengan spasi atau nol jadi saya harus menulis fungsi:Saya menggunakan angka 2 digit nol-empuk di dalam tanda kurung sehingga format tidak kacau jika ada 10-99 host di
$list
(100+ masih akan mengacaukannya). Alternatif akan menunda pencetakan sampai seorangEND {}
blok, dan untuk / regexp-pertandingan / hanya memasukkan nama host ke dalam satu dari tiga array, misalnyaok
,fail
,unknown
. atau hanya satu array asosiatif (misalnyahosts[hostname]="OK"
). Kemudian Anda bisa menghitung jumlah garis dan menggunakannya untuk memutuskan seberapa lebar bidang penghitung garis seharusnya.Saya juga memutuskan untuk membuat keluaran membedakan antara host yang tidak dikenal (
CONNECTION IMPOSSIBLE
) dan host yang tidak terjangkau (CONNECTION FAIL
).The
sort -k3
adalah opsional, itu hanya kelompok output denganfping
hasil ( "hostname masih hidup", "hostname adalah unreachable" atau "hostname: Nama atau layanan yang tidak dikenal"). Tanpa itusort
, host yang tidak dikenal akan selalu muncul pertama kali di output. Cukupsort
tanpa-k3
kehendak untuk mengurutkan berdasarkan nama host.sumber