Capture un valor específico de df -h –total usando PHP

5 minutos de lectura

¿Cómo puedo completar una variable que contiene el valor total del contenido inferior extraído después de ejecutar? df -h --total en centos. Nota: el resultado no es de la línea de comandos sino de un archivo php.

¿Cómo solo capturo el valor porcentual en la última línea usando 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% -

IE quisiera una variable que tenga el valor 63%

$variable = 63%

  • ¿Cómo estás ejecutando el comando?

    – Aynber

    12 de junio de 2019 a las 13:25

  • ` $resultado = $ssh->exec(‘df -h –total’);` Estoy ejecutando desde un archivo php

    – Omari Víctor Omosa

    12 de junio de 2019 a las 13:26

  • Probar shell_exec en lugar de capturar la salida y luego jugar con la cuerda para agarrar lo que necesita.

    – ReynierPM

    12 jun 2019 a las 13:30

avatar de usuario
Sean brillante

Puedes añadir grep y awk para extraer la información que desea:

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

Tenga en cuenta que debe cambiar los tipos de cotización que está haciendo para que esto funcione correctamente. Simplemente copie y pegue lo anterior y debería estar bien.

  • Buena respuesta. ¿Podemos mejorar aún más la respuesta para que solo capturemos el dígito con el porcentaje?

    – Omari Víctor Omosa

    12 de junio de 2019 a las 13:34

  • Intval es una buena forma de obtener un valor int, pero en este caso solo necesito el que tiene un valor porcentual. Está devolviendo un resultado cero.

    – Omari Víctor Omosa

    12 de junio de 2019 a las 16:04

  • @OmariVictorOmosa – Ah, ahora entiendo lo que dices. Voy a actualizar.

    – Sean brillante

    12 de junio de 2019 a las 16:12

Tal vez pueda adaptar este fragmento a sus necesidades:

$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

  • Me gustaría que pudieras explicar más

    – Omari Víctor Omosa

    12 de junio de 2019 a las 14:11

avatar de usuario
Dragón demoníaco perdido

Lo siento si no entendí bien la pregunta. Sin embargo, creo que esta podría ser la respuesta que estás buscando… 🙂

Versión 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);
    }
}

PD. @ReynierPM no necesita un shell_exec para obtener un retorno de salida completo … solo tiene que definir una matriz en la que desea almacenar los datos … 🙂 y no es una cadena, pero puede transformarla fácilmente en uno usando implosionar()

Versión 2:

Lo siento, si no está de acuerdo, pero no me siento cómodo simplemente editando la respuesta de @Nazariy, ya que estoy agregando/cambiando demasiado (en esta etapa, consulte el historial de edición :).

#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);

Explicación:


matriz_mapa lo aplica también a todos los valores en la matriz “array_map: aplica la devolución de llamada a los elementos de las matrices dadas”


Primero le damos una función de devolución de llamada que se llamará para cada elemento, y le pasamos la variable $línea (usamos esto para almacenar la línea creada por la explosión)

Usamos array_maps para explotar por \n (para crear una entrada de matriz para cada línea nueva) (Por supuesto, hacemos una explosión en $datos)
*4
Ahora que cada línea está separada… Dividimos las líneas separadas en subcadenas y las almacenamos en nuevas variables. preg_split(‘/\s+/’,$line) dividir $line en una matriz sin tener que lidiar con el problema de múltiples espacios en blanco. s de pie para el espacio.

Perdón por el formato… editaré esto último 🙂

  • Gracias por su respuesta, ya que puedo llegar a mi respuesta final con el valor porcentual. Aunque mezclé tu respuesta con @sean_bright. Estoy revisando su versión 2 para ver si puedo aprender de

    – Omari Víctor Omosa

    12 de junio de 2019 a las 16:01

  • @OmariVictorOmosa Me alegro de haber podido ayudar 🙂 … Para ser justos, la respuesta dada por sean_bright es mucho más ingeniosa … Si tiene más preguntas sobre el fragmento de código, solo pregunte …

    – Demoniodragón perdido

    14 de junio de 2019 a las 17:18

¿Ha sido útil esta solución?