¿Cómo guardar en formato XML / JSON toda la información del comando "libre" y del comando "vmstat" incluyendo el tiempo?

1

Lo necesito cada 2 minutos:

mando

Estoy usando Debian (solo modo texto).

Ed S
fuente
Desafortunadamente, no hay una manera fácil de hacer esto es bash, no hay ningún --out-jsonparámetro. Entonces tendrá que hacer esto manualmente. Aquí hay una respuesta que debería ayudarlo en su camino para formatear la salida a Json askubuntu.com/questions/272535/…
mrwhale
@mrwhale: ¿Y el formato XML?
Ed S
Estás solo para eso. Sin embargo, es un comando xmllintcomo parte de libxml2-utils que puede ser de alguna ayuda para usted. ¿Ha considerado usar otro idioma que tenga bibliotecas para el soporte de Json / XML para hacer esto? Como perl o python
mrwhale
¿Qué tipo de estructura tenías en mente? ¿Qué has intentado hasta ahora?
bertieb
@bertieb: No tengo ideia. ¿Hay alguna manera de convertir el archivo de texto en XML?
Ed S

Respuestas:

4

¿Cómo puedo (simplemente) envolver esta salida en XML / JSON?

Asumiendo que no quieren etiquetas individuales para total, used, free sharedetc, se puede envolver toda la producción en las etiquetas que encierran, en su caso:

XML

El siguiente script podría guardarse como (por ejemplo) memoryinfo-xml.sh:

#!/bin/bash
# memoryinfo-xml.sh - wrap output of free + vmstat in XML tags
echo "<output>"
  echo -e "\t<date>$(date)</date>"
  echo -e "\t<free>$(free)</free>"
  echo -e "\t<vmstat>$(vmstat)</vmstat>"
echo "</output>" 

salida de ejemplo:

<output>                                                                                                          
    <date>Thu 30 Mar 16:21:18 BST 2017</date>
    <free>             total       used       free     shared      buffers     cached
Mem:       3853532    3721596     131936     100868     227652    3024584
-/+ buffers/cache:     469360    3384172
Swap:      1182716       2512    1180204</free>
    <vmstat>procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0   2512 132084 227652 3024584    0    0     3     2    4    4  1  0 99  0  0</vmstat>
</output>

Como puede ver, ¡no es exactamente bonito!

JSON

Muy similar a antes, guardar como (por ejemplo) memoryinfo-json.sh:

#! / bin / bash
# memoryinfo-json.sh - salida de ajuste de free + vmstat en json
# gracias a https://stackoverflow.com/a/1252191 por \ n reemplazo
echo "{\" salida \ ":"
  echo -e "\ t {\" fecha \ ": \" $ (fecha) \ ","
  echo -e "\ t \" free \ ": \" $ (free | sed ': a; N; $! ba; s / \ n / || / g') \ ","
  echo -e "\ t \" vmstat \ ": \" $ (vmstat | sed ': a; N; $! ba; s / \ n / || / g') \ ""
eco "}"

salida de ejemplo:

{
    "salida": {
        "date": "jue 30 mar 16: 48: 51 BST 2017",
        "free": "total de buffers compartidos gratuitos usados ​​en caché || Mem: 3853532 3722428 131104 100868 227888 3024844 || - / + buffers / caché: 469696 3383836 || Swap: 1182716 2512 1180204",
        "vmstat": "procs-- - - - - - memory-- - - - - - - swap-- - - - io-- - - system-- - - --cpu-- - - || rb swpd free buff cache si so bi bo in cs us sy id wa st || 1 0 2512 131096 227888 3024844 0 0 3 2 4 4 1 0 99 0 0 "
    }
}

Tenga en cuenta que para obtener un JSON válido , las nuevas líneas se han reemplazado por un carácter de doble canalización ( ||), a través del sedreemplazo .

bertieb
fuente
Me gustaría convertir un archivo de texto como entrada del script. ¿Es posible? Tengo output.txt que es: echo -e " date\ n \ n free\ n \ n vmstat\ n" >> output.txt
Ed S