我想解析df
的输出,所以我做
arr=( $(df -hPT | awk '{print $1, $2, $3, $5, $6, $7}') )
for f in ${arr[@]}; do echo ${f[*]};sleep 1;done
但我得到
Filesystem
Size
Avail
Use%
Mounted
devtmpfs
7.8G
7.8G
0%
/dev
tmpfs
7.8G
7.7G
3%
我希望的地方
Filesystem Size Avail Use% Mounted
devtmpfs 7.8G 7.8G 0%
/dev tmpfs 7.8G 7.7G 3%
我的计划是$f
将是每行的数组,因此我可以操纵每一行并且printf
输出更远。
问题
我是如何获得每awk
行的df
输出数组的?
答案 0 :(得分:2)
读取时使用...循环
df -hPT | while read line ; do echo "$line" | awk '{print $1, $2, $3, $5, $6, $7}' ;sleep 1 ; done
答案 1 :(得分:2)
解决方案1: 在单个while
循环中:
df -hPT | while read first second third fourth fifth sixth seventh
do
echo $first $second $third $fifth $sixth $seventh
sleep 1
done
解决方案第二: 关注单awk
可能对您有帮助。
df -hPT | awk '{print $1, $2, $3, $5, $6, $7;system("sleep 1")}'
答案 2 :(得分:0)
您可以使用bash内置lines
将文件/流的行存储到数组中:
mapfile -t lines < <(df -hPT | awk '{print $1, $2, $3, $5, $6, $7}')
for line in "${lines[@]}"; do
manipulate "$line"
done
需要从process substitution重定向,因此我们不会引入任何子shell。
您已经看到在for循环中未能quote the variable时会发生什么:总是引用您的变量(除非您确切知道原因为何)。
答案 3 :(得分:0)
如果您将IFS设置为\ n,那样:
IFS=$'\n' arr=( $(df -hPT | \
awk '{print $1, $2, $3, $5, $6, $7}') )
for f in ${arr[@]}; do
echo ${f[*]}
done
echo "nb elt in arr = ${#arr[@]}"