如何逐行解析df?

时间:2018-05-07 13:06:41

标签: linux bash awk

我想解析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输出数组的?

4 个答案:

答案 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[@]}"