【问题标题】:Capture specific value from df -h --total using PHP使用 PHP 从 df -h --total 捕获特定值
【发布时间】:2019-06-13 00:13:11
【问题描述】:

在centos 上运行df -h --total 后,我如何从下面提取的内容中填充一个包含总值的变量。注意:结果不是来自命令行,而是来自 php 文件。

如何使用 PHP 仅捕获最后一行中的百分比值?

Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 20G 685M 20G 4% /
devtmpfs 40G 0 40G 0% /dev
tmpfs 40G 0 40G 0% /dev/shm
tmpfs 40G 177M 40G 1% /run
tmpfs 40G 0 40G 0% /sys/fs/cg
/dev/mapper/rhel-usr 20G 3.2G 17G 16% /usr
/dev/sda2 1014M 223M 792M 22% /boot
/dev/mapper/rhel-opt_mycom 100G 37G 63G 37% /opt/my
/dev/mapper/oradb-nimsdb 2.0T 1.5T 614G 71% /opt/my/data
/dev/mapper/redo-logs 305G 72G 234G 24% /opt/my/data/
/dev/mapper/rhel-home 20G 472M 20G 3% /home
/dev/mapper/rhel-var 20G 1.4G 19G 7% /var
tmpfs 7.9G 0 7.9G 0% /run/user/1000
total 3.6T 2.3T 1.4T 63% -

I.E.我想要一个值为 63% 的变量

$variable = 63%

【问题讨论】:

  • 你是如何运行命令的?
  • ` $result = $ssh->exec('df -h --total');`我从一个php文件运行
  • 尝试shell_exec 来捕获输出,然后使用字符串来获取您需要的内容。

标签: php linux-disk-free


【解决方案1】:

你可以添加grep和awk来提取你想要的信息:

$result = $ssh->exec("df -h --total | grep '^total ' | awk '{print $5}'");

请注意,您需要更改引用的类型才能使其正常工作。只需复制并粘贴以上内容即可。

【讨论】:

  • 不错的答案,我们可以进一步改进答案,以便我们只捕获带有百分比的数字吗?
  • Intval 是获取 int 值的好方法,但在这种情况下,我只需要具有百分比值的那个。它返回一个零结果
  • @OmariVictorOmosa - 啊,我明白你现在在说什么。我会更新的。
【解决方案2】:

也许您可以根据自己的需要调整这个 sn-p:

$data = <<<EOF
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                  143180     89740     53440  63% /
tmpfs                       64         0        64   0% /dev
tmpfs                   143124        76    143048   0% /tmp
tmpfs                     4096       912      3184  22% /var
tmpfs                       64         0        64   0% /mnt
ubi1_0                  468256     12144    456112   3% /opt/data/settings
EOF;

print_r(array_map(function($line){
    $elements=preg_split('/\s+/',$line);
    return(array(
    'filesystem' => $elements[0],
    '1k-blocks' => $elements[1],
    'used' => $elements[2],
    'available' => $elements[3],
    'use%' => $elements[4],
    'mounted_on' => $elements[5]
    ));
},explode("\n",$data)));

https://gist.github.com/cschaba/4740323

【讨论】:

  • 希望您能进一步解释
【解决方案3】:

对不起,如果我误解了这个问题,我认为这可能是您正在寻找的答案...... :)

版本 1:

#executes the comand and stores in array
$testExec = exec("df -h --total" ,$testArray);
#moves to the end off the array
$testArrayEnd = end($testExec);
#splits the last line into an array
$stringArray = explode(' ',$testArrayEnd);
foreach($stringArray as $string){
    #checks if the string contains a % 
    if (preg_match("/%/", $string)) {
        #there is only one % so this is what you're looking for
        $percentage = $string;
        var_dump($percentage);
    }
}

附言。 @ReynierPM您不需要shell_exec来获得完整的输出返回...您只需要定义一个要在其中存储数据的数组... :)并授予它不是字符串,但您可以轻松地对其进行转换使用implode()合二为一

版本 2:

抱歉,如果您不同意,但我不喜欢编辑 @Nazariy 答案,因为我正在添加/更改很多内容(在此阶段请参阅编辑历史记录:)。

#thanks go out to ReynierPM
#returns string with every entry being separated by a newline 
$output = shell_exec('df -h --total');

$ArrayFull=(array_map(function($line){ /*<-- *¹ & *² */
    $elements=preg_split('/\s+/',$line); /*<--- *4  */>
    return(array(
    'filesystem' => $elements[0],
    '1k-blocks' => $elements[1],
    'used' => $elements[2],
    'available' => $elements[3],
    'use%' => $elements[4],
    'mounted_on' => $elements[5]
    ));
},explode("\n",$output))); /*(<--- *³)*/

#removes bloat
unset($ArrayFull[0]);
#Rebase array keys https://stackoverflow.com/questions/5943149/rebase-array-keys-after-unsetting-elements
$ArrayFull=array_values($ArrayFull);

#if you only want the last value ;)
$lastVallue = end($ArrayFull);

解释:

*¹
array_map 也将它应用于数组中的所有值 “array_map - 将回调应用于给定数组的元素”
*²
我们首先给它一个回调函数,它将为每个元素调用,并传递给它变量 $line (我们用它来存储由爆炸创建的线)
*³
我们使用 array_maps 来展开 \n (为每一个新行创建一个数组条目)(我们当然对 $data 进行爆炸)
*4
所以现在每一行都是分开的......我们将分开的行分成子字符串并将它们存储在新变量中。 preg_split('/\s+/',$line) 将 $line 拆分为一个数组,而无需处理多个空白的问题。 s 代表空间。

抱歉格式化...稍后会编辑:)

【讨论】:

  • 感谢您的回答,因为我可以得到具有百分比值的最终答案。尽管我将您的答案与@sean_bright 混为一谈。我正在浏览你的第 2 版,看看我是否可以从中学习
  • @OmariVictorOmosa 很高兴我能帮上忙 :) ...公平地说,sean_bright 给出的答案更加巧妙...如果您对代码 sn-p 有任何进一步的问题问...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多