Bash 배열을 매개변수로 분할하는 방법

Bash 배열을 매개변수로 분할하는 방법

나는 Python 프로세스, RAM 사용량, PID 및 상태를 사람이 읽을 수 있는 형식으로 컬러 선으로 나열하는 bash 스크립트를 작성했습니다. 하지만 스크립트 작업 시간에 문제가 있습니다. 반복적인 명령어 작성으로 인해 ps업무에 너무 많은 시간을 소비하게 됩니다 .

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 $?

나는 이 접근 방식을 변경하고 작업 시간을 단축하기 위해 모든 스크립트를 다음과 같이 재배치하기로 결정했습니다.

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 $?

이제 원하는 정보를 즉시 얻을 수 있지만 ps해당 정보의 형식을 지정하고 표시하는 데 몇 가지 문제가 있습니다.

${SCRIPTS}각 매개변수를 어떻게 가져와서 분할하고 prepare_text함수 에 전달하는지 모르겠습니다 .

제가 뭔가 잘못 이해한 것 같아요.

답변1

여기에서 필요한 정보만 추출하고 ps다른 것은 아무것도 추출하지 않고 나머지는 awk( 가 아닌 ) 수집, 비교, 형식화 등의 작업을 수행하도록 하십시오. bash예:

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")
}'

값을 조정하고 필요한 경우 제목을 추가하십시오.

관련 정보