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
.