如何填充一个变量,以保存在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% -也就是说,我想要一个值为63%的变量
$variable = 63%发布于 2019-06-12 13:30:43
您可以添加grep和awk来提取您想要的信息:
$result = $ssh->exec("df -h --total | grep '^total ' | awk '{print $5}'");请注意,您需要更改引用类型,这样才能正常工作。只要复制并粘贴上面的内容,你就应该很好。
发布于 2019-06-12 13:31:19
也许您可以根据您的需要修改这个片段:
$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)));发布于 2019-06-12 13:56:29
对不起,如果我误解了这个问题,我认为这可能是你想要的答案.:)
版本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就可以获得完整的输出返回..。你只需要定义一个数组,你就可以把数据存储在.),并授予它不是字符串,但可以通过使用内爆()轻松地将其转换为字符串。
版本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);解释:
*1
地图也将其应用于数组中的所有值"array_map -将回调应用于给定数组的元素“。
*面积
我们首先给它一个回调函数,该函数将对每个元素调用,并将变量$line传递给它(我们使用这个函数来存储爆炸所创建的行)。
**
我们使用array_maps来爆炸\n (为每个新行创建一个数组条目)(我们在$data上做了一个意外爆炸)
*4
现在每条线都分开了..。我们将分隔的行拆分为子字符串,并将它们存储在新变量中。preg_split('/\s+/',$line)将$line分割成一个数组,而不必处理多个空格的问题。for‘代表空间。
很抱歉格式化..。编辑后一篇文章:)
https://stackoverflow.com/questions/56563340
复制相似问题