使用 PHP 从 df -h --total 捕获特定值
Capture specific value from df -h --total using PHP
我如何填充一个变量来保存在 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%
您可以添加grep
和awk
来提取您想要的信息:
$result = $ssh->exec("df -h --total | grep '^total ' | awk '{print }'");
请注意,您需要更改正在执行的引用类型才能使其正常工作。只需复制并粘贴以上内容即可。
也许您可以根据需要调整此代码段:
$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)));
抱歉,如果我误解了这个问题,我怎么认为这可能是您正在寻找的答案...:)
版本 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);
}
}
PS。 @ReynierPM 你不需要 shell_exec 来获得完整的输出 return...你只需要定义一个数组,你想在其中存储数据...... :) 并授予它不是一个字符串,但您可以使用 implode()
轻松地将其转换为一个字符串
版本 2:
抱歉,如果您不同意,但我觉得只是编辑@Nazariy 的答案感觉不舒服,因为我 adding/changing 太多了(现阶段请参阅编辑历史记录:)。
#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
$ArrayFull=array_values($ArrayFull);
#if you only want the last value ;)
$lastVallue = end($ArrayFull);
解释:
*¹
array_map 也应用数组中的所有值
"array_map — Applies the callback to the elements of the given arrays"
*²
我们首先给它一个回调函数,它将为每个元素调用,并将变量 $line 传递给它(我们用它来存储由爆炸创建的线)
*³
我们使用 array_maps 按 \n 展开(为每个新行创建一个数组条目)(我们当然对 $data 进行展开)
*4
所以现在每一行都是分开的......我们将分开的行分成子字符串并将它们存储在新变量中。
preg_split('/\s+/',$line) 将 $line 拆分为一个数组,而不必处理多个 whitspace 的问题。 s 代表 space.
抱歉格式化...将编辑后者:)
我如何填充一个变量来保存在 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%
您可以添加grep
和awk
来提取您想要的信息:
$result = $ssh->exec("df -h --total | grep '^total ' | awk '{print }'");
请注意,您需要更改正在执行的引用类型才能使其正常工作。只需复制并粘贴以上内容即可。
也许您可以根据需要调整此代码段:
$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)));
抱歉,如果我误解了这个问题,我怎么认为这可能是您正在寻找的答案...:)
版本 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);
}
}
PS。 @ReynierPM 你不需要 shell_exec 来获得完整的输出 return...你只需要定义一个数组,你想在其中存储数据...... :) 并授予它不是一个字符串,但您可以使用 implode()
轻松地将其转换为一个字符串版本 2:
抱歉,如果您不同意,但我觉得只是编辑@Nazariy 的答案感觉不舒服,因为我 adding/changing 太多了(现阶段请参阅编辑历史记录:)。
#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
$ArrayFull=array_values($ArrayFull);
#if you only want the last value ;)
$lastVallue = end($ArrayFull);
解释:
*¹
array_map 也应用数组中的所有值
"array_map — Applies the callback to the elements of the given arrays"
*²
我们首先给它一个回调函数,它将为每个元素调用,并将变量 $line 传递给它(我们用它来存储由爆炸创建的线)
*³
我们使用 array_maps 按 \n 展开(为每个新行创建一个数组条目)(我们当然对 $data 进行展开)
*4
所以现在每一行都是分开的......我们将分开的行分成子字符串并将它们存储在新变量中。
preg_split('/\s+/',$line) 将 $line 拆分为一个数组,而不必处理多个 whitspace 的问题。 s 代表 space.
抱歉格式化...将编辑后者:)