你如何从txt中获取项目到bash中的presentabletable?
How do you get items from txt into presentable table in bash?
我正在尝试从 Node01.pc 中检索项目并将其放入 table。
示例:
echo ${NodeCPU[0]}
能够打印行中的项目。
但是当我使用 printf 或 echo 时,它要么中断要么不显示数组项的输出。
table 的格式似乎有效,并且仅当它不是数组时才显示。难道我看到的文件不止这些?
Node01.pc 包含
192.168.0.99
2
70
16
80
4
4
100
4
VS122:NMAD:20:20:1:1
VS122:NAMD:20:20:1:1
RS123:FEM:10:20:1:1
QV999:BEM:20:20:1:1
但我只需要第 3,5,7,9 行
我不确定这样做的最佳方法是什么,或者我什至是否需要将项目存储到数组中。
我考虑过从文本文件中检索所有文本并创建一个包含所有数据的新文件,但我不确定该怎么做。
这是我现在拥有的代码。
#!/bin/bash
Node01=($(cat Node01.pc))
Node02=($(cat Node02.pc))
Node03=($(cat Node03.pc))
Node04=($(cat Node04.pc))
Node05=($(cat Node05.pc))
NodeCPU=("${Node01[2]}" "${Node02[2]}" "${Node03[2]}" "${Node04[2]}" "${Node05[2]}")
NodeMEM=("${Node01[4]}" "${Node02[4]}" "${Node03[4]}" "${Node04[4]}" "${Node05[4]}")
NodeHDD=("${Node01[6]}" "${Node02[6]}" "${Node03[6]}" "${Node04[6]}" "${Node05[6]}")
NodeNET=("${Node01[8]}" "${Node02[8]}" "${Node03[8]}" "${Node04[8]}" "${Node05[8]}")
seperator=----------------------
seperator=$seperator$seperator
rows="%-10s| %-7s| %-7s| %-7s| %-7s\n"
TableWidth=140
printf "%-10s| %-7s| %-7s| %-7s| %-7s\n" NodeNumber CPU MEM HDD NET
printf "%.${TableWidth}s\n" "$seperator"
for((i=0;i<=4;i++))
do
printf "$rows" "$(( $i+1 ))" "${NodeCPU[i]}" "${NodeMEM[i]}" "${NodeHDD[i]}" "${NodeNET[i]}"
done
read
这是我要显示的示例
NodeNumber | CPU | MEM | HDD | NET
----------------------------------
1 | 10 | 20 | 20 | 40
2 | 10 | 20 | 20 | 40
3 | 10 | 20 | 20 | 40
4 | 10 | 20 | 20 | 40
5 | 10 | 20 | 20 | 40
编辑这是我目前得到的:
NodeNumber| CPU | MEM | HDD | NET
--------------------------------------------
| 4 | 70
| 5 | 90
| 6 | 100
| 6 | 70
| 40 | 40
我遇到的问题是
printf "$rows" "$(( $i+1 ))" "${NodeCPU[i]}" "${NodeMEM[i]}" "${NodeHDD[i]}" "${NodeNET[i]}"
为什么要担心所有单独的数组?只需循环遍历当前目录下的所有 "Node*.pc"
个文件,将每个文件的内容读入一个 readarray
的数组,然后输出文件数和元素数。 2, 4, 6, 8
数组的正确格式(根据需要调整元素输出),例如
#!/bin/bash
cnt=1 ## file counter
## print heading
printf "NodeNumber | CPU | MEM | HDD | NET\n----------------------------------\n"
for i in Node*.pc; do ## loop over all Node*.pc files in directory
readarray -t node < "$i" ## read contents into array
## output count and elements 2, 4, 6, 8 in proper format
printf "%-11s| %-4s| %-4s| %-4s| %s\n" $((cnt++)) \
"${node[2]}" "${node[4]}" "${node[6]}" "${node[8]}"
done
例子Use/Output
将显示的示例数据复制到当前目录中的文件 Node01.pc
,您将得到:
$ bash node.sh
NodeNumber | CPU | MEM | HDD | NET
----------------------------------
1 | 70 | 80 | 4 | 4
(我调用脚本node.sh
)
它会将每个文件的信息输出为单独的行编号 1, 2, ...
查看所有内容,让我知道这是否是您想要的。 (您还可以通过设置 FS=\n
并将行视为单个记录中的列来更快地使用 awk
执行相同的操作)
您可以在 awk
中执行相同的操作:
awk '
BEGIN {
RS=""; FS="\n"
printf "NodeNumber | CPU | MEM | HDD | NET\n----------------------------------\n"
}
NF >= 9 {
printf "%-11s| %-4s| %-4s| %-4s| %s\n",++cnt,,,,
}
' Node*.pc
(注意:在awk
中字段编号是从1开始的,而在bash中数组索引是从0开始的)
输出相同。
我正在尝试从 Node01.pc 中检索项目并将其放入 table。
示例:
echo ${NodeCPU[0]}
能够打印行中的项目。
但是当我使用 printf 或 echo 时,它要么中断要么不显示数组项的输出。
table 的格式似乎有效,并且仅当它不是数组时才显示。难道我看到的文件不止这些?
Node01.pc 包含
192.168.0.99
2
70
16
80
4
4
100
4
VS122:NMAD:20:20:1:1
VS122:NAMD:20:20:1:1
RS123:FEM:10:20:1:1
QV999:BEM:20:20:1:1
但我只需要第 3,5,7,9 行
我不确定这样做的最佳方法是什么,或者我什至是否需要将项目存储到数组中。
我考虑过从文本文件中检索所有文本并创建一个包含所有数据的新文件,但我不确定该怎么做。
这是我现在拥有的代码。
#!/bin/bash
Node01=($(cat Node01.pc))
Node02=($(cat Node02.pc))
Node03=($(cat Node03.pc))
Node04=($(cat Node04.pc))
Node05=($(cat Node05.pc))
NodeCPU=("${Node01[2]}" "${Node02[2]}" "${Node03[2]}" "${Node04[2]}" "${Node05[2]}")
NodeMEM=("${Node01[4]}" "${Node02[4]}" "${Node03[4]}" "${Node04[4]}" "${Node05[4]}")
NodeHDD=("${Node01[6]}" "${Node02[6]}" "${Node03[6]}" "${Node04[6]}" "${Node05[6]}")
NodeNET=("${Node01[8]}" "${Node02[8]}" "${Node03[8]}" "${Node04[8]}" "${Node05[8]}")
seperator=----------------------
seperator=$seperator$seperator
rows="%-10s| %-7s| %-7s| %-7s| %-7s\n"
TableWidth=140
printf "%-10s| %-7s| %-7s| %-7s| %-7s\n" NodeNumber CPU MEM HDD NET
printf "%.${TableWidth}s\n" "$seperator"
for((i=0;i<=4;i++))
do
printf "$rows" "$(( $i+1 ))" "${NodeCPU[i]}" "${NodeMEM[i]}" "${NodeHDD[i]}" "${NodeNET[i]}"
done
read
这是我要显示的示例
NodeNumber | CPU | MEM | HDD | NET
----------------------------------
1 | 10 | 20 | 20 | 40
2 | 10 | 20 | 20 | 40
3 | 10 | 20 | 20 | 40
4 | 10 | 20 | 20 | 40
5 | 10 | 20 | 20 | 40
编辑这是我目前得到的:
NodeNumber| CPU | MEM | HDD | NET
--------------------------------------------
| 4 | 70
| 5 | 90
| 6 | 100
| 6 | 70
| 40 | 40
我遇到的问题是
printf "$rows" "$(( $i+1 ))" "${NodeCPU[i]}" "${NodeMEM[i]}" "${NodeHDD[i]}" "${NodeNET[i]}"
为什么要担心所有单独的数组?只需循环遍历当前目录下的所有 "Node*.pc"
个文件,将每个文件的内容读入一个 readarray
的数组,然后输出文件数和元素数。 2, 4, 6, 8
数组的正确格式(根据需要调整元素输出),例如
#!/bin/bash
cnt=1 ## file counter
## print heading
printf "NodeNumber | CPU | MEM | HDD | NET\n----------------------------------\n"
for i in Node*.pc; do ## loop over all Node*.pc files in directory
readarray -t node < "$i" ## read contents into array
## output count and elements 2, 4, 6, 8 in proper format
printf "%-11s| %-4s| %-4s| %-4s| %s\n" $((cnt++)) \
"${node[2]}" "${node[4]}" "${node[6]}" "${node[8]}"
done
例子Use/Output
将显示的示例数据复制到当前目录中的文件 Node01.pc
,您将得到:
$ bash node.sh
NodeNumber | CPU | MEM | HDD | NET
----------------------------------
1 | 70 | 80 | 4 | 4
(我调用脚本node.sh
)
它会将每个文件的信息输出为单独的行编号 1, 2, ...
查看所有内容,让我知道这是否是您想要的。 (您还可以通过设置 FS=\n
并将行视为单个记录中的列来更快地使用 awk
执行相同的操作)
您可以在 awk
中执行相同的操作:
awk '
BEGIN {
RS=""; FS="\n"
printf "NodeNumber | CPU | MEM | HDD | NET\n----------------------------------\n"
}
NF >= 9 {
printf "%-11s| %-4s| %-4s| %-4s| %s\n",++cnt,,,,
}
' Node*.pc
(注意:在awk
中字段编号是从1开始的,而在bash中数组索引是从0开始的)
输出相同。