2 votos

¿Cómo convertir el informe de información del sistema de Mac en .spx a .csv?

Necesito crear una lista de todas las aplicaciones instaladas en formato .csv. El informe de Información del Sistema de Mac es genial, pero no puedo encontrar una manera de convertir el archivo .spx que genera a .csv que es más útil para mis necesidades.

Mi objetivo es generar una lista de aplicaciones instaladas.

Me gusta la Información del Sistema porque me proporciona datos útiles como la fecha de la última modificación, el tipo de aplicación (Universal, Intel).

¿Hay formas de realizar esta recolección de datos en un archivo de texto con formato csv?

1voto

Siguza Puntos 258

Con suficiente scripting, seguramente podrías extraer los datos del volcado XML, pero System Profiler tiene una bandera de línea de comandos que hace que emita JSON, lo cual es mucho más conveniente para trabajar:

system_profiler -json -nospawn SPApplicationsDataType -detailLevel full

Y es un poco chapucero, pero la herramienta de línea de comandos de la "Arquitectura de Scripting Abierto" de Apple osascript admite JavaScript, por lo que se puede abusar para analizar y manipular JSON sin instalar ninguna herramienta de terceros. Aquí tienes el JavaScript que convierte el volcado JSON a CSV:

let apps = /* [system_profiler output] */.SPApplicationsDataType;
// Recolectar todas las claves presentes en cualquier fila
let keys = apps.reduce((keys, app) =>
{
    for(let k of Object.keys(app))
        if(keys.indexOf(k) == -1)
            keys.push(k);
    return keys;
}, []);
// Extraer valores y reemplazar valores faltantes con cadena vacía
let csv = apps.map(app => keys.map(k => app[k] || ''));
// Agregar claves como encabezados de columnas
csv.unshift(keys);
// Generar la salida (impresa implícitamente en osascript)
csv.map(row => row.map(field =>
{
    // Convertir todas las entradas en cadenas
    let s = field + '';
    // Escapar comas, comillas y saltos de línea
    return s.match(/[,"\n]/) ? '"' + s.replace('"', '""') + '"' : s;
}).join(',')).join('\n')

Ahora solo tenemos que reemplazar /* [system_profiler output] */ con $(cat /dev/stdin), poner barras diagonales invertidas delante de las comillas dobles y otras barras diagonales, comprimirlo todo en una cadena de shell, encadenar los dos comandos juntos y tendremos un comando de una sola línea que emite CSV:

system_profiler -json -nospawn SPApplicationsDataType -detailLevel full | osascript -l JavaScript <<<"let apps = $(cat /dev/stdin).SPApplicationsDataType; let keys = apps.reduce((keys, app) => { for(let k of Object.keys(app)) if(keys.indexOf(k) == -1) keys.push(k); return keys; }, []); let csv = apps.map(app => keys.map(k => app[k] || '')); csv.unshift(keys); csv.map(row => row.map(field => { let s = field + ''; return s.match(/[,\"\\n]/) ? '\"' + s.replace('\"', '\"\"') + '\"' : s; }).join(',')).join('\n')"

Puede ser enviado a un archivo añadiendo algo como >~/Desktop/dump.csv.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X