我有一个数组,其中包含有关每个网卡的详细信息。每个数组索引由三个空格分隔的值组成。
我想要一个漂亮的表格作为输出。有没有办法为索引中的每个值分配格式模式?
到目前为止,这就是我使用的:
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 一起使用。