使用 printf 格式化数组的输出

使用 printf 格式化数组的输出

我有一个数组,其中包含有关每个网卡的详细信息。每个数组索引由三个空格分隔的值组成。

我想要一个漂亮的表格作为输出。有没有办法为索引中的每个值分配格式模式?

到目前为止,这就是我使用的:

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

但它并没有带来期望的结果。

答案1

这是对您已经在做的事情的轻微修改:

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]} 未引用的这样 shell 就会在用于分隔值的空格上分割值。printf因此看到 3 个值,并为每个值重复 %-20s 格式。然后我在每个网卡后面添加一个换行符以制作一个漂亮的表格。

set -f如果我们不加引号的变量,顶部的 很重要;否则 shell 将介入并尝试全局它在未加引号的变量中看到的任何通配符。

示例输出:

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

答案2

是的,有一种方法,使用awk.
一个例子:

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

另一种方法是获取不同变量中的值,然后printf从 bash 执行操作。喜欢 :

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 一起使用。

相关内容