Como dividir a matriz Bash em argumentos

1

Eu escrevi um script bash para listar processos python, uso de RAM e PID e status em formato legível por humanos com linhas coloridas. Mas eu tenho alguns problemas com o tempo de trabalho do script. Por causa dos repetidos comandos ps escritos, o tempo de trabalho está demorando muito.

SCRPITS='ps x | grep python | grep -v ".pyc" | grep -v grep | awk  '{print $NF}''

prepare_text () {
    if [[ ${2%.*} -gt ${RAMLIMIT} ]]; then
        # RED
        TEXT='printf "3[31m%-62s %'10d %2s %5s %6s\n3[0m" "${1}" "${2}" "KB" "${3}" "${4}"'
    elif [[ ${2%.*} -gt ${RAMLIMIT}/2 ]]; then
        # YELLOW
        TEXT='printf "3[33m%-62s %'10d %2s %5s %6s\n3[0m" "${1}" "${2}" "KB" "${3}" "${4}"'
    else
        # GREEN
        TEXT='printf "3[32m%-62s %'10d %2s %5s %6s\n3[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 $?

Eu decidi mudar essa abordagem e reorganizei todo o script para reduzir o tempo de trabalho conforme abaixo:

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 "3[31m%-62s %'10d %2s %5s %6s\n3[0m" "${1}" "${2}" "KB" "${3}" "${4}"'
    elif [[ $((${2%.*})) -gt ${RAMLIMIT}/2 ]]; then
        # YELLOW
        TEXT='printf "3[33m%-62s %'10d %2s %5s %6s\n3[0m" "${1}" "${2}" "KB" "${3}" "${4}"'
    else
        # GREEN
        TEXT='printf "3[32m%-62s %'10d %2s %5s %6s\n3[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 $?

Agora posso obter as informações que eu quero de ps de uma vez, mas tenho algum problema com a formatação e a exibição dessas informações.

Não consigo descobrir como posso obter cada argumento de ${SCRIPTS} , dividi-los e passar para a função prepare_text .

Eu acho que não entendi algo.

    
por Sencer H. 03.10.2016 / 16:59

1 resposta

2

Sugiro que você extraia as informações necessárias de ps , nada mais, e deixe awk (não bash ) fazer o resto: grepping, comparações, formatação. Exemplo:

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="3[31m"
  else if (vsz>lim/2) col="3[33m"
  else col="3[32m"
  # printout
  printf("%s%-62s %10d KB %5s %6s%s\n",
    col, $0, vsz, pid, stat, "3[0m")
}'

Ajuste os valores e adicione os cabeçalhos conforme necessário.

    
por 03.10.2016 / 18:31