web-dev-qa-db-ja.com

printfを使用して配列の出力をフォーマットする

各NICに関する詳細を含むアレイがあります。各配列インデックスは、スペースで区切られた3つの値で構成されます。

出力としてNiceテーブルを用意したいと思います。インデックスの各値にフォーマットパターンを割り当てる方法はありますか?

これまでのところ、これは私が使用するものです:

NIC_details[0]='wlp2s0 192.168.1.221 xx:xx:xx:xx:xx:xx'
NIC_details[1]='wwan0 none xx:xx:xx:xx:xx:xx'
NIC_details[2]='virbr0 192.168.122.1 00:00:00:00:00:00'

printf "%-20s\n" "${NIC_details[@]}"

$ 1、$ 2、および$ 3の位置で配列インデックスの値にアクセスし、それらがスペースで区切られていることを確認してから、各$ X位置にフォーマットパターンを適用する方法はありますか?

私も試しました

echo "$i" | column -t

しかし、それは望ましい結果をもたらしません。

4
caracal

ここでは、すでに行っていた処理を少し変更します。

set -f # to prevent filename expansion
for i in ${!NIC_index[@]}
do
  printf "%-20s" ${NIC_details[i]}
  printf "\n"
done

forループを追加して、すべての配列インデックスを調べます-それが${!NIC...構文。これは数値配列であるため、代わりにインデックスを直接ループすることもできます。

意図的に${NIC_details[i]}unquotedシェルは、値を区切るために使用したスペースで値を分割します。したがって、printfは3つの値を確認するため、それぞれの値に対して%-20s形式を繰り返します。次に、各NIC=の後に改行を追加して、Niceテーブルを作成します。

set -f変数を引用符で囲まないままにしておく場合は、上部の重要です。それ以外の場合、シェルはステップインして、引用符で囲まれていない変数に含まれるワイルドカード glob を試みます。

出力例:

wlp2s0              192.168.1.221       xx:xx:xx:xx:xx:xx
wwan0               none                xx:xx:xx:xx:xx:xx
virbr0              192.168.122.1       00:00:00:00:00:00
5
Jeff Schaller

はい、方法があります。awkを使用してください。
一例:

echo ${NIC[0]} | awk '{ printf "%-10s %s\n", $1, $2 }'

別の方法は、異なる変数の値を取得し、bashからprintfを実行することです。お気に入り :

var1=$(echo ${NIC[0]} | cut -d ' ' -f1)
var2=$(echo ${NIC[0]} | cut -d ' ' -f2)
var3=$(echo ${NIC[0]} | cut -d ' ' -f3)

そして、printfを$ var1,2,3とともに使用します。

1
mazs