Cómo dividir la matriz de Bash en arguments

Escribí un script bash para listr processs de python, uso de ram y PID y estado en forma legible para humanos con líneas de colors. Pero tengo algunos problemas con el time de trabajo del guión. Debido a los commands ps repetidamente escritos, el time de trabajo lleva demasiado time.

 SCRPITS=`ps x | grep python | grep -v ".pyc" | grep -v grep | awk '{print $NF}'` prepare_text () { if [[ ${2%.*} -gt ${RAMLIMIT} ]]; then # RED TEXT=`printf "\033[31m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` elif [[ ${2%.*} -gt ${RAMLIMIT}/2 ]]; then # YELLOW TEXT=`printf "\033[33m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` else # GREEN TEXT=`printf "\033[32m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` fi TEXTBODY+=${TEXT} } display () { printf "$SUBJECT\n" printf "%-62s %13s %5s %8s\n" "PROCESS" "RAM USAGE" "PID" "STATUS" printf "===========================================================================================\n" printf "${TEXTBODY}\n" } for SCRIPT in ${SCRPITS} do USAGE=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $6}'` PID=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $2}'` STATUS=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $8}'` prepare_text ${SCRIPT} ${USAGE} ${PID} ${STATUS} done display exit $? 

Decidí cambiar ese enfoque y reorderar todo el script para acortar el time de trabajo de la siguiente manera:

 OIFS=$IFS #save original IFS='\n' SCRIPTS=`ps aux | grep python | grep -v ".pyc" | grep -v grep | awk '{print $NF,",",$5,",",$2,",",$8}'` IFS=${OIFS} prepare_text () { if [[ $((${2%.*})) -gt ${RAMLIMIT} ]]; then # RED TEXT=`printf "\033[31m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` elif [[ $((${2%.*})) -gt ${RAMLIMIT}/2 ]]; then # YELLOW TEXT=`printf "\033[33m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` else # GREEN TEXT=`printf "\033[32m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"` fi TEXTBODY+=${TEXT} } display () { printf "$SUBJECT\n" printf "%-62s %13s %5s %8s\n" "PROCESS" "RAM USAGE" "PID" "STATUS" printf "===========================================================================================\n" OIFS=$IFS IFS="," set ${SCRIPTS} for SCRIPT in ${SCRIPTS} do prepare_text $1 $2 $3 $4 done printf "\n\n" IFS=${OIFS} printf "${TEXTBODY}\n" } display exit $? 

Ahora puedo get la información que quiero de ps a la vez, pero tengo un problema con el formatting y la visualización de esa información.

No puedo entender cómo puedo get cada argumento desde ${SCRIPTS} , dividirlos y pasar a la function prepare_text .

Supongo que malinterpreto algo.

Sugiero que extraigas la información que necesitas de ps , nada más, y deja que awk (no bash ) haga el rest: grepping, comparaciones, formateo. Ejemplo:

 ps -ax --no-headers -o pid,vsz,stat,command | awk -v lim=23000 ' # let awk do the grepping /bash/ && !/awk/ { # save first 3 fields pid=$1 vsz=$2 stat=$3 # rest is command line, possibly spanning multiple fields for (i=4;i<=NF;++i) $(i-3)=$i NF-=3 # decide on color if (vsz>lim) col="\033[31m" else if (vsz>lim/2) col="\033[33m" else col="\033[32m" # printout printf("%s%-62s %10d KB %5s %6s%s\n", col, $0, vsz, pid, stat, "\033[0m") }' 

Ajuste los valores y añada encabezados según sea necesario.