AWK输出到Bash数组

10

我正在尝试将一个简单命令的内容放入bash数组中,但是遇到了一些问题。

df -h | awk '{ print  $5" "$6 }'

显示我的系统文件系统中使用的百分比,输出看起来像这样:

1% /dev
1% /dev/shm
1% /var/run
0% /var/lock
22% /boot
22% /home
22% /home/steve

我希望将这些行放入一个bash数组中:

array=$(df -h| awk '{ print $5 $6 }')

然而,当我打印出数组时,得到以下结果:

5%
/
1%
/dev
1%
/dev/shm
1%
/var/run
0%
/var/lock
22%
/boot
22%
/home
22%
/home/steve

Bash是基于空格而不是换行符形成数组的,我该如何解决这个问题?


在Bash中使用数组后,你想要做什么?我的意思是...也许你可以在awk中完成。 - Dr. belisarius
脚本的下一部分将运行类似于此命令“find . -type f -exec du -sh {} ; | sort -h”的内容,针对所选文件系统(用户将从第一部分的数组中选择一个填充过多的文件系统)。我想修改第二个命令,只显示文件系统中最大的10个文件,以便用户可以选择是否删除它们。 - user428300
3个回答

10

您需要重置IFS变量(用于数组的分隔符)。

OIFS=$IFS #save original
IFS=','
df -h | awk '{ print $5" "$6"," }'

1
不客气。如果这个回答对您有帮助,请点赞并标记为采纳的答案。 - Brian Clements
3
您可以在AWK命令中省略逗号,并将IFS设置为换行符:IFS=$'\n'(之后不要忘记IFS=$OIFS)。 - Dennis Williamson
1
我注意到当我在if语句中使用换行符时,有时会出现奇怪的行为。我已经养成了使用逗号的习惯。 - Brian Clements

1

你可以在Bash中不使用awk来完成这个任务。

array=()
while read -a line; do
    array+=("${line[4]} ${line[5]}")
done < <(df -h)

0

你可以使用这个:

eval array=( $(df -h | awk '{ printf("\"%s %s\" ", $5, $6) }') )

1
“eval”是用来干什么的?只需在AWK命令中省略额外的引号,直接进行数组赋值即可。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接