Получите определенное значение из df -h --total с помощью PHP - PullRequest
1 голос
/ 12 июня 2019

Как я могу заполнить переменную, содержащую общее значение снизу содержимого, извлеченного после выполнения df -h --total в centos. Примечание: результат получен не из командной строки, а из 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%

Ответы [ 3 ]

5 голосов
/ 12 июня 2019

Вы можете добавить grep и awk, чтобы извлечь нужную информацию:

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

Обратите внимание, что для правильной работы вам нужно изменить типы цитирования, которые вы делаете. Просто скопируйте и вставьте вышеперечисленное, и все будет хорошо.

2 голосов
/ 12 июня 2019

Возможно, вы сможете адаптировать этот фрагмент для своих нужд:

$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

1 голос
/ 12 июня 2019

извините, если я неправильно понял вопрос, как я думаю, это может быть ответом, который вы ищете ...:)

Версия 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 для получения полного результата вывода ... вам просто нужно определить массив, в котором вы хотите хранить данные ... :) и предоставить его не как строку, но вы можете легко преобразовать его в один с помощью 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 /5966191/perebazirovat-klychi-massiva-posle-sbrosa-elementov
$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 на массив без необходимости решать проблему с несколькими пробелами. с места для места.

Извините за форматирование ... отредактирую последнее:)

...