- 论坛徽章:
- 1
|
本帖最后由 xiaoshichao143 于 2014-01-27 17:10 编辑
回复 5# huang6894 - #!/bin/bash
- if [[ $# -ne 2 ]];then
- echo "Usage: sh $0 OWNER INTERVAL_TIME"
- exit 1
- fi
- INPUT_FILE="file.txt"
- TOTAL_FILE="total.txt"
- #定义属主,用于搜索属于该属主的记录
- OWNER="$1"
- #定义时间间隔,用于搜索在该时间天数内的记录
- TIME_INTERVAL_INPUT="$2"
- #得到"="号的个数
- NUM_OF_EQUAL="$(($(head -n 1 ${INPUT_FILE} | wc -c)-1))"
- #格式化输出时间
- function format() {
- TIME_H=$(eval echo \$$1)
- TIME_M=$(eval echo \$$2)
- TIME_S=$(eval echo \$$3)
- if [[ ${#TIME_H} -eq 1 ]];then
- eval $1="0\$$1"
- fi
- if [[ ${#TIME_M} -eq 1 ]];then
- eval $2="0\$$2"
- fi
- if [[ ${#TIME_S} -eq 1 ]];then
- eval $3="0\$$3"
- fi
- }
- echo "jobname|jobnumber|qsub_time|start_time|end_time|cpu|mem|io|maxvmem|count" | awk -F'|' '{color=30;for(i=1;i<=NF;i++){color++;if(color==38)color=31;printf "\033[0;%s;1m%s\033[0m|",color,$i};print ""}' | sed 's/|$//'
- #删除临时文件
- rm -f ${OWNER}.txt ${INPUT_FILE}.* ${TOTAL_FILE}
- #备份文件
- cp ${INPUT_FILE}{,.bak}
- #格式化文件,筛选出需要的行
- sed -ri '/^(=|owner|job|qsub|start|end|cpu|mem|io[^w]|max)/!d' ${INPUT_FILE}.bak
- #将大文件分割成可处理的小文件
- split -l $((11*11*11*6)) -a 4 ${INPUT_FILE}.bak ${INPUT_FILE}.
- #读每一个分割后的小文件
- for file in $(ls ${INPUT_FILE}.a*)
- do
- #格式化分割后的小文件
- sed ':a;$!N;s/\n/ /g;ta' ${file} | sed "s/=\{${NUM_OF_EQUAL}\} /\n/g" | sed '/^$/d' | grep "${OWNER}" \
- | sed 's/ \{2,\}/|/g' > ${OWNER}.txt
- cat ${OWNER}.txt | while read line
- do
- #从1970-01-01到现在的杪数
- TIME_NOW=$(date +%s -d "$(date)")
- #从1970-01-01到qsub_time时间之间的秒数
- TIME_QSUB=$(date +%s -d "$(echo ${line} | sed 's/.*qsub_time|\(.*\) start_time.*/\1/')")
- #从qsub_time到现在所隔的天数
- TIME_INTERVAL_GET=$(((${TIME_NOW}-${TIME_QSUB})/86400))
- #如果从qsub_time到现在所隔的天数少于所输入的天数,则是需要的记录
- if [[ ${TIME_INTERVAL_GET} -le ${TIME_INTERVAL_INPUT} ]];then
- jobname="$(echo $line | sed 's/.*jobname|\(.*\) jobnumber.*/\1/')"
- jobnumber="$(echo $line | sed 's/.*jobnumber|\(.*\) qsub_time.*/\1/')"
- qsub_time="$(echo $line | sed 's/.*qsub_time|\(.*\) start_time.*/\1/')"
- start_time="$(echo $line | sed 's/.*start_time|\(.*\) end_time.*/\1/')"
- end_time="$(echo $line | sed 's/.*end_time|\(.*\) cpu.*/\1/')"
- cpu="$(echo $line | sed 's/.*cpu|\(.*\) mem.*io.*/\1/')"
- mem="$(echo $line | sed 's/.*mem|\(.*\) io.*maxvmem.*/\1/')"
- io="$(echo $line | sed 's/.*io|\(.*\) maxvmem.*/\1/')"
- maxvmem="$(echo $line | sed 's/.*maxvmem|\(.*\)/\1/')"
- #maxvmem="$(echo $line | sed 's/.*maxvmem|\(.*\) arid.*/\1/')"
- TIME_INTERVAL_BETWEEN_END_AND_START=$(($(date +%s -d "$end_time")-$(date +%s -d "$start_time")))
- TIME_HOUR="00"
- TIME_MINUTE="00"
- if [[ ${TIME_INTERVAL_BETWEEN_END_AND_START} -lt 60 ]];then
- TIME_SECOND="${TIME_INTERVAL_BETWEEN_END_AND_START}"
- elif [[ ${TIME_INTERVAL_BETWEEN_END_AND_START} -lt 3600 ]];then
- TIME_MINUTE="$((${TIME_INTERVAL_BETWEEN_END_AND_START}/60))"
- TIME_SECOND="$((${TIME_INTERVAL_BETWEEN_END_AND_START}%60))"
- else
- TIME_HOUR="$((${TIME_INTERVAL_BETWEEN_END_AND_START}/(60*60)))"
- TIME_MINUTE="$((${TIME_INTERVAL_BETWEEN_END_AND_START}%(60*60)/60))"
- TIME_SECOND="$((${TIME_INTERVAL_BETWEEN_END_AND_START}%60))"
- fi
- format TIME_HOUR TIME_MINUTE TIME_SECOND
- count="${TIME_HOUR}:${TIME_MINUTE}:${TIME_SECOND}"
- echo "$jobname|$jobnumber|$qsub_time|$start_time|$end_time|$cpu|$mem|$io|$maxvmem|$count" | awk -F'|' '{color=30;for(i=1;i<=NF;i++){color++;if(color==38)color=31;printf "\033[0;%s;1m%s\033[0m|",color,$i};print ""}' | sed 's/|$//'
- if echo $maxvmem | grep -q 'G';then
- maxvmem=$(echo "scale=4;$(echo $maxvmem | tr -d 'G')*1024" | bc)
- fi
- echo "$cpu|$mem|$io|${maxvmem%M}|$count" >> ${TOTAL_FILE}
- fi
- done
- done
- echo -e "\n===>count all:"
- TOTAL_CPU=$(awk -F'|' '{sum += $1} END{print sum}' ${TOTAL_FILE})
- TOTAL_MEM=$(awk -F'|' '{sum += $2} END{print sum}' ${TOTAL_FILE})
- TOTAL_IO=$(awk -F'|' '{sum += $3} END{print sum}' ${TOTAL_FILE})
- TOTAL_VMEM=$(awk -F'|' '{sum += $4} END{print sum}' ${TOTAL_FILE})
- TOTAL_HOUR=$(awk -F'[|:]' '{sum += $5} END{print sum}' ${TOTAL_FILE})
- TOTAL_MINUTE=$(awk -F'[|:]' '{sum += $6} END{print sum}' ${TOTAL_FILE})
- TOTAL_SECOND=$(awk -F'[|:]' '{sum += $7} END{print sum}' ${TOTAL_FILE})
- SECOND=$((${TOTAL_SECOND}%60))
- MINUTE=$(((${TOTAL_MINUTE}+${TOTAL_SECOND}/60)%60))
- HOUR=$((${TOTAL_HOUR}+(${TOTAL_MINUTE}+${TOTAL_SECOND}/60)/60))
- format HOUR MINUTE SECOND
- echo -e "$1\tcpu:${TOTAL_CPU}\tmem:${TOTAL_MEM}\tio:${TOTAL_IO}\tmaxvmem:${TOTAL_VMEM}M\tcount:${HOUR}:${MINUTE}:${SECOND}"
复制代码 |
|