代码之家  ›  专栏  ›  技术社区  ›  Sandra Schlichting

如何逐行解析df?

  •  2
  • Sandra Schlichting  · 技术社区  · 7 年前

    我想分析 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 输出per df公司 线

    4 回复  |  直到 7 年前
        1
  •  3
  •   RavinderSingh13 Nikita Bakshi    7 年前

    解决方案1: 在单个 while 回路:

    df -hPT | while read first second third fourth fifth sixth seventh
    do
       echo $first $second $third $fifth $sixth $seventh
       sleep 1
    done
    

    解决方案2: 以下单个 awk 可能对你也有帮助。

    df -hPT | awk '{print $1, $2, $3, $5, $6, $7;system("sleep 1")}'
    
        2
  •  2
  •   Sandra Schlichting    7 年前

    读取时使用。。。环

    df -hPT | while read line ; do echo "$line" | awk '{print $1, $2, $3, $5, $6, $7}' ;sleep 1 ; done
    
        3
  •  0
  •   ctac_    7 年前

    如果将IFS设置为这样:

    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[@]}"
    
        4
  •  0
  •   benrifkah    3 年前

    您可以使用bash内置 mapfile 要将文件/流的行存储到数组中,请执行以下操作:

    mapfile -t lines < <(df -hPT | awk '{print $1, $2, $3, $5, $6, $7}')
    for line in "${lines[@]}"; do
        manipulate "$line"
    done
    

    需要从 process substitution 所以我们不引入任何子shell。

    你已经看到了当你失败时会发生什么 quote the variable 在for循环中: 总是 引用您的变量(除非您确切知道为什么不引用)。