linux下格式化输出系统基本信息,在centos6.2下测试通过
#!/bin/bash - #=============================================================================== # # FILE: check_sys_info.sh # # DESCRIPTION:表格形式输出系统的基本信息,纯属蛋疼作,新手,有什么不足的地方请见谅 # 欢迎改进,有更好的方法,不吝赐教。 # BUGS: --- # AUTHOR: 猪头饼 , liaodehai@126.com # CREATED: 10/28/2012 11:10:19 AM CST # VESION: 1.0 # REVISION: --- #=============================================================================== set -o nounset # Treat unset variables as an error #首先trap 1 2 3 15信号,重要 #trap 'kill -9 $BG_PID;echo;exit 2' 1 2 3 15 function trap_exit { tput cnorm clear kill -9 $BG_PID } trap 'trap_exit;exit 2' 1 2 3 15 #捕捉1 2 3 15 信号,执行命令 #--------------------------------------------- #检测判断基础值 #--------------------------------------------- SYS_NO=5.6 #定义版本号 BIT=32 #定义位数 DISK_SPEED_INIT=150 #基本速度 #--------------------------------------------- #TPUT命令定义 #--------------------------------------------- tput init #开启tput BOLD=`tput bold` #粗体 B_LINK=`tput blink` #闪烁 REV=`tput rev` #逆转视图 NORMAL=`tput sgr0` #正常屏幕 CURSOR_OFF=`tput civis` #隐藏光标 CURSOR_ON=`tput cnorm` #开始光标 TPUT_RED=`echo -e "\e[40;31m"` #红色字体 P_COL=`tput cols` #获取屏幕行数 P_ROW=`tput lines` #获取屏幕列数 HOLD_C=`expr ${P_COL} / 2 ` #一半列数 HOLD_R=`expr ${P_ROW} / 2 + 15 ` #定位行数 #错误输出 OUT_PUT_ERROR="${BOLD}${TPUT_RED}${B_LINK}* ${NORMAL}${BOLD}${TPUT_RED}" ##定义结束 #--------------------------------------------- #函数开始 #--------------------------------------------- ##进度条打印函数 bars () { stty -echo >/dev/null 2>&1 i=0 b='' while true do ((i+=2)) echo -ne "\e[${HOLD_R};30H正在创建报表---" # if [ $i -gt 100 ];then # continue # else printf "进度:[%-50s]%d%%\r" $b $i #fi sleep 1.1 b=#$b done stty echo echo } # ---------- end of function BARS ---------- ##高亮函数 colour () { #背景色_前景色 case $1 in black_red) echo -e "\e[40;31m" ;; black_green) echo -e "\e[40;32m" ;; black_yellow) echo -e "\e[40;33m" ;; esac # --- end of case --- } # ---------- end of function colour ---------- ##函数结束 #--------------------------------------------- # 主程序开始 #--------------------------------------------- ${CURSOR_OFF} clear #首先使bars函数后台运行 bars & BG_PID=$! #-------- 主机信息 -------- ##信息获取 ##系统当前时区 TIME_ZONE=$(date -R | awk '{print $NF}') ##系统当前日期与时间 DATE=$(date +%F) TIME=$(date +%T) ##服务器制造商 PRODUCT_NAME=$(dmidecode | grep "Product Name" |awk 'NR==1{print $NF}') ##主机名 MACHINE_NAME=$(uname -n) ##系统发行版本 SYS_RELEASE=$(cat /etc/issue|head -1) SYS_DENFI_VER=$(echo ${SYS_RELEASE} | grep "${SYS_NO}") #过滤此版本 if [[ -z "${SYS_DENFI_VER}" ]];then SYS_RELEASE="${OUT_PUT_ERROR}${SYS_RELEASE}${NORMAL}" fi #如果版本不为定义版本则标红输出 ##系统架构(位数) SYS_FRAMEWORK=$(file /sbin/init | awk '{print $3}') if [[ ${SYS_FRAMEWORK%%-*} -ne ${BIT} ]];then SYS_FRAMEWORK="${OUT_PUT_ERROR}${SYS_FRAMEWORK}${NORMAL}" fi ##系统内核版本 SYS_CORES_VER=$(uname -r) ##CPU类型 CPU_TYPE=$(cat /proc/cpuinfo|grep "name" | cut -d: -f2 |uniq -c| column -t) ##CPU主频 CPU_CLOCK_SPEED=$(cat /proc/cpuinfo|grep "MHz"|uniq|awk -F: '{print $2"MHZ"}'|column -t) ##CPU物理个数 PHYSICS_CPU=$(cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l) ##单棵CPU核心数 #ONE_CPU_CORE=$(cat /proc/cpuinfo|grep "cores"|uniq|awk -F: '{print $2}'|column -t) ##单棵核心中CPU线程数 CPU_NT_THREAD=$(cat /proc/cpuinfo | grep physical |sort | uniq -c | awk 'NR==1{print $1}'|column -t) ##CPU总核心数(物理个数*单棵CPU的线程数) VIRTUAL_CPU=$(cat /proc/cpuinfo|grep "name" | cut -d: -f2 |uniq -c | awk '{print $1}') ##内存大小 MEM_SIZE=$(free -m|grep -i "mem"|awk '{print $2"MB"}') ##swap大小 SW_SIZE=$(free -m | grep -i "swap" | awk '{print $2"MB"}') ##硬盘状态 DISK_STATUS=$(smartctl -H `df -h | grep boot | grep -v grep | awk '{print $1}' ` | grep Status | awk -F'[ :]' '{print $NF}') if [[ "${DISK_STATUS}" != "OK" ]];then DISK_STATUS="Error Or Empty" DISK_STATUS="${OUT_PUT_ERROR}${DISK_STATUS}${NORMAL}" fi ##硬盘大小 DISK_SIZE=$(fdisk -l |grep :|awk '/\/dev\/sd[a-z]/{print $2,$3"G"}') ##硬盘分区 DISK_PARTITION=$(df -lh | grep -v tmpfs |awk '{print $1,"\t",$2,"\t",$6}'| column -t) ##硬盘读写速度 TEST_COUNT=1 #开始数值 TEST_TIMES=3 #检测次数 while [[ "$TEST_COUNT" -le "$TEST_TIMES" ]]; do ###dd写测速 DD_W_TEST[$TEST_COUNT]=$(dd if=/dev/zero bs=1024 count=1000000 of=/tmp/1Gb.file 2>&1 |awk -F'[, ]+' '/sec/{print $8}') if [[ "${DD_W_TEST[$TEST_COUNT]}" -lt "${DISK_SPEED_INIT}" ]];then DD_W_TEST[$TEST_COUNT]="${OUT_PUT_ERROR}${DD_W_TEST[$TEST_COUNT]}${NORMAL}" fi ###dd读测速 (默认130Mb/s) DD_R_TEST[$TEST_COUNT]=$(dd if=/tmp/1Gb.file bs=64k 2>&1 |dd of=/dev/null 2>&1 |awk -F'[, ]+' '/sec/{print $8}') if [[ "${DD_R_TEST[$TEST_COUNT]}" -lt "130" ]] ;then DD_R_TEST[$TEST_COUNT]="${OUT_PUT_ERROR}${DD_R_TEST[$TEST_COUNT]}${NORMAL}" fi ###hdparm读测速 HD_TEST[$TEST_COUNT]=$(hdparm -t `df -h | grep boot | grep -v grep | awk '{print $1}'` | awk -F'[ =]+' '{print $11}'| column -t) if [[ "${HD_TEST[$TEST_COUNT]%%.*}" -lt "${DISK_SPEED_INIT}" ]] ;then HD_TEST[$TEST_COUNT]="${OUT_PUT_ERROR}${HD_TEST[$TEST_COUNT]}${NORMAL}" fi ((TEST_COUNT++)) done #iptable状态 if (service iptables status |grep INPUT 2>&1 1>/dev/null) ; then FIREWALL_STATUS="iptables 已经开启" else FIREWALL_STATUS="iptables 没有开启" fi ##SeLINUX状态 SE_STATUS=$(cat /etc/selinux/config | grep "SELINUX=" | grep -v "^#" | cut -d= -f2) ##系统包安装情况 ADMIN_PACKAGE=$(rpm -qa |grep system |wc -l | awk '{print"系统工具包:"$0 }') BASE_PACKAGE=$(rpm -qa |grep base |wc -l |awk '{print"基础包:"$0 }') #-------- 网络信息 -------- ##网卡个数 N_CARD_NUMBER=$(ifconfig | egrep "^eth[0-1]|^em[0-1]" | egrep -v "^eth[0-1]:[0-1]|^em[0-1]:[0-1]" |awk '{print $1}'|wc -l) ##所有网卡资讯 N_CARD=($(ifconfig | egrep "^eth[0-1]|^em[0-1]" | egrep -v "^eth[0-1]:[0-1]|^em[0-1]:[0-1]" |awk '{print $1}')) N_COUNT=0 #开始数值 while [[ $N_COUNT -lt $N_CARD_NUMBER ]]; do ##网卡IP地址 N_CARD_IPADDR[$N_COUNT]=$(ifconfig ${N_CARD[$N_COUNT]} | awk -F'[ :]+' 'NR==2{print $4}') ##网卡速率 N_CARD_SPEED[$N_COUNT]=$(ethtool ${N_CARD[$N_COUNT]} | awk '/[Ss]peed/{print $2}' | grep -v "Unknown") N_CARD_SPEED[$N_COUNT]=${N_CARD_SPEED[$N_COUNT]:-0Mb/s} if [ "${N_CARD_SPEED[$N_COUNT]%%M*}" -ne 1000 ];then N_CARD_SPEED[$N_COUNT]="${OUT_PUT_ERROR}${N_CARD_SPEED[$N_COUNT]}${NORMAL}" fi ((N_COUNT++)) done ##网卡驱动类型 N_CARD_DRIVE=$(ethtool -i ${N_CARD[0]} |awk -F: 'NR==1{print $NF}'| column -t ) ##网卡驱动版本 N_CARD_VER=$(ethtool -i ${N_CARD[0]} |awk -F: 'NR==2{print $NF}'|column -t) ##网卡驱动固件版本 N_CARD_FIR_VER=$(ethtool -i ${N_CARD[0]} |awk -F: 'NR==3{print $NF}'|column -t) ##结束打印进程 kill -9 $BG_PID ${CURSOR_ON} #-------- 显示菜单 -------- #菜单坐标函数定义 xy() { _R=$1 #行 _C=$2 #列 _TEXT=$3 tput cup $_R $_C echo -n $_TEXT } #XY光标显示位置 center() { _STR=$2 #字符串 _ROW=$3 LEN=`echo $_STR | wc -l` COLS=`tput cols` #列数目 HOLD_COL=`expr $COLS - $LEN` case $1 in all) NEW_COL=`expr $HOLD_COL / 2 ` #中心位置显示文本=列数-字符串长度/2 ;; half) NEW_COL=`expr $HOLD_COL / 4 ` #开始一半的2/1位置显示 ;; eighth) NEW_COL=`expr $HOLD_COL / 8 ` #一半的一半 ;; esac tput cup $_ROW $NEW_COL echo -n $_STR } #函数结束 #开始制表 tput clear colour black_green center "half" "${BOLD}<<系统基本信息表>>${NORMAL}" 1 xy 2 1 "日期:$DATE" xy 2 20 "时间:${TIME}" #第一条横线 xy 3 1 "-" #横向打印 for ((i=2;i<${HOLD_C};i++));do printf "%s" - done #向下打印 xy 4 0 "|" for ((i=4;i<=${HOLD_R};i++));do printf "|" printf "\n" done #中沿线 for ((i=4;i<${HOLD_R};i++));do center "all" "|" $i #eighth_center "|" $i center "eighth" "|" $i done colour black_yellow xy 5 2 "${BOLD}信息名称" center "half" "${BOLD}参考值${NORMAL}" 5 #第二条横线 xy 7 1 "-" #横向打印 for ((i=2;i<${HOLD_C};i++));do printf "%s" - done #输出关键字 OUTPUT_NAME="服务器制造商 主机名 系统发行版本 系统架构 系统内核版本 CPU类型 CPU主频 CPU物理个数 单棵核心中线程数 CPU总核心数 内存大小 swap大小 硬盘状态 硬盘大小 iptable状态 SeLINUX状态 系统包安装情况 DD写速度(参考:${DISK_SPEED_INIT}) DD读速度(参考:130) hdparm读(参考:${DISK_SPEED_INIT}) 网卡个数 所有网卡名称 网卡ip地址 网卡速率 网卡驱动类型 网卡驱动版本 网卡驱动固件版本 硬盘分区" #值变量 OUTPUT_VAR="${PRODUCT_NAME} ${MACHINE_NAME} ${SYS_RELEASE} ${SYS_FRAMEWORK} ${SYS_CORES_VER} ${CPU_TYPE} ${CPU_CLOCK_SPEED} ${PHYSICS_CPU} ${CPU_NT_THREAD} ${VIRTUAL_CPU} ${MEM_SIZE} ${SW_SIZE} ${DISK_STATUS} ${DISK_SIZE} ${FIREWALL_STATUS} ${SE_STATUS} ${ADMIN_PACKAGE}|${BASE_PACKAGE} 第一次:${DD_W_TEST[1]} |第二次:${DD_W_TEST[2]} |第三次:${DD_W_TEST[3]} (单位:MB/s) 第一次:${DD_R_TEST[1]} |第二次:${DD_R_TEST[2]} |第三次:${DD_R_TEST[3]} (单位:MB/s) 第一次:${HD_TEST[1]} |第二次:${HD_TEST[2]} |第三次:${HD_TEST[3]} (单位:MB/s) ${N_CARD_NUMBER} ${N_CARD[*]} ${N_CARD_IPADDR[*]} ${N_CARD_SPEED[*]} ${N_CARD_DRIVE} ${N_CARD_VER} ${N_CARD_FIR_VER} ${DISK_PARTITION}" #关键字输出 _x=8 for S_NAME in ${OUTPUT_NAME};do _y=1 xy $_x $_y "${S_NAME}:" ((_x++)) done #更改IFS输出值 OLD_IFS=$IFS IFS=$'\x0A' #值输出 _xx=8 for S_VAR in ${OUTPUT_VAR};do _yy=22 xy $_xx $_yy "${S_VAR}" ((_xx++)) done IFS=$OLD_IFS #尾部横线 xy ${HOLD_R} 1 "-" #横向打印 for ((i=2;i<${HOLD_C};i++));do printf "%s" - done printf "\n\n" ##--------程序结束-------