#!/bin/bash
#< Script to display top 20 process swap utilisation in KB

TMP_TOPRC="/var/tmp/toprc"
MY_TOPRC="${HOME}/.toprc"
MY_TOPRC_BAK="/var/tmp/${LOGNAME}_toprc_$$"
TOP_OUT="/var/tmp/topout_$$"

trap "recover_toprc; exit 1" 1 2 3 15

recover_toprc() {
  if [ -e "${MY_TOPRC_BAK}" ]; then
     mv ${MY_TOPRC_BAK} ${MY_TOPRC} 2>/dev/null
  else
     rm -f ${MY_TOPRC}
     rm -f ${TOP_OUT}
  fi
}

cat <<EoTOPRC >${TMP_TOPRC}
OAbcDgHIjklMnTP|qrsuzyV{EFW[X
5HIP
EoTOPRC

if [ -e "${MY_TOPRC}" ]; then
  cp -p ${MY_TOPRC} ${MY_TOPRC_BAK}
fi

mv ${TMP_TOPRC} ${MY_TOPRC}

top -b -n1 > ${TOP_OUT}
sed '1,13d' ${TOP_OUT} > ${TOP_OUT}.tmp && mv ${TOP_OUT}{.tmp,}

perl -e "printf (\"%s\n\",\"=\"x50);
        print \"Top 20 Processes by Swap Utilisation (KB)\n\";
        printf (\"%s\n\",\"=\"x50);"

awk '
 $1 ~ /^[0-9][0-9]*M/ {
    sub( /M/, "", $1 )
    $1 = $1 * 1024
 } {
    printf( "%d\t%s\t%s\n", $1, $2, $NF )
 }
' ${TOP_OUT} | sort -k1,1rn | sed -n '1,20p' > ${TOP_OUT}.tmp && mv ${TOP_OUT}{.tmp,}

awk '
 BEGIN {
    printf( "%s\t%s\t%s\n%s\t%s\t%s\n", "SWAP", "PID", "PROCESS", "====", "===", "=======" );
 }
' && cat ${TOP_OUT}

recover_toprc
rm -f ${TOP_OUT}

exit 0