Holas,
Primero que nada, creo que el siguiente comando hace lo mismo que tu primer script:
Segundo, permíteme simplificar tu código, en caso de que quieras seguir usándolo. El programa AWK que sigue hace lo mismo que tus 8 llamadas a AWK arriba:
Código BASH:
Ver originalawk '
BEGIN {
print "PID\tPPID\tESTADO\tCOMANDO";
pid="";
ppid="";
state="";
name="";
}
/^Pid/ { pid=$2 }
/PPid/ { ppid=$2 }
/State/ { state=$2 }
/Name/ { name=$2 }
END {
print pid "\t" ppid "\t" status "\t" name
}'
Seguramente se puede escribir un programa que lea todos los archivos e imprima una línea por cada uno, pero al menos este lee un archivo e imprime el resumen en una sola llamada a AWK.
BASH soporta arrays, pero es necesario entender cómo funcionan, y no es la forma usual de lidiar con múltiples argumentos o con cadenas separadas por espacios. En general las soluciones con for o xargs son mucho más claras y se adaptan mejor a cómo funciona la shell.
Ya que no estás usando ps (si lo usaras, el comando que escribí arriba sería todo lo que necesitás), y que estás leyendo de /proc, considera usar algo como esto:
Código BASH:
Ver originalfor STATUS_FILE in /proc/*/status; do
# llamada a AWK
done
Esto recorre todos los archivos cuyo nombre sea 'status' y que se encuentren en un directorio hijo (1 solo nivel) de /proc. Corres el riesgo de que exista un archivo que cumpla eso y no pertenezca a un proceso, pero por lo que sé no hay nada en /proc que cumpla esa regla y no sea el archivo de estado de un proceso. Para estar seguro, podrías cambiar el * arriba por [0-9]*, con lo cual en vez de aceptar cualquier nombre en el directorio hijo de /proc, solamente permites nombres que comiencen con un número.
Saludos.