从 shell_exe('df -h') 获取特定列数据作为关联数组

问题描述 投票:0回答:2

我需要构建一个脚本来查询具有多个驱动器的远程存储服务器的可用空间。

我只需使用 SSH 登录,运行

df
并将输出放入变量中。看起来像这样:

    Array
(
    [0] => Filesystem           1K-blocks      Used Available Use% Mounted on
    [1] => /dev/sda1             59392320  14949240  41426064  27% /
    [2] => /dev/sdd1            140592240 114503840  18946708  86% /home/overflow
    [3] => /dev/sdf1            287826944 273844324         0 100% /home/node2
    [4] => /dev/sde1            287826944 253278964  19927228  93% /home/node3
    [5] => /dev/sdg1            287826944   4771768 268434424   2% /home/node4
    [6] => /dev/sdh1            287826944   4329780 268876412   2% /home/node5
    [7] => /dev/sdi1            488302976 439077756  24420864  95% /home/node1
    [8] => /dev/sdh1            287826944   4329780 268876412   2% /home/mnode6
    [9] => /dev/sdh1            287826944   4329780 268876412   2% /home/mnode7
    [10] => tmpfs                  3145728         0   3145728   0% /tmp
)

我需要提取每个“节点”或“mnode”有多少可用空间。所以也许是一个很好的数组,有这样的对:

mnode1 => 24000000
node1 => 24000000
node2 => 0
node3 => 20000000
php arrays associative-array shell-exec diskspace
2个回答
4
投票

使用

explode(' ', preg_replace('/ +/', ' ', $line))
获取所有值均已拆分的数组。


0
投票

要生成一个关联数组,其中键来自

Mounted On
值,值来自
Available
值,您可以循环并解析
shell_exec('df')
输出字符串的行(忽略第一行中的标题)并使用
sscanf()
将数据解析为所需的关联数组。
%*s
将匹配非空白字符,但不会捕获返回的匹配项。我将使用数组解构(在第一个元素之前访问第二个元素,以最大限度地减少声明的变量总数。

代码:

$result = [];
foreach (explode(PHP_EOL, rtrim(shell_exec('df'))) as $i => $line) {
    if ($i) {
        [1 => $mountedOn, 0 => $result[$mountedOn]] = sscanf($line, '%*s %*d %*d %d %*s %s');
    }
}
var_export($result);

输出:

[
    '/' => 41426064,
    '/home/overflow' => 18946708,
    '/home/node2' => 0,
    '/home/node3' => 19927228,
    '/home/node4' => 268434424,
    '/home/node5' => 268876412,
    '/home/node1' => 24420864,
    '/home/mnode6' => 268876412,
    '/home/mnode7' => 268876412,
    '/tmp' => 3145728,
]

我还发布了一个非常类似问题的答案:仅显示 shell_exec('df') 中的磁盘使用数据的特定列

© www.soinside.com 2019 - 2024. All rights reserved.