免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11850 | 回复: 10
打印 上一主题 下一主题

请教一个shell换行的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-01 15:02 |只看该作者 |倒序浏览
我是bash,我写个简单脚本,把vmstat的结果保存到文件中,其中有句vm=`vmstat 1 2`,然后 echo $vm >> $file,但我打开$file发现vmstat的结果,本该四行的确没有分行,全部堆在一行,这是为什么,我该如何让他换行,就向直接执行vmstat 1 2的结果一样?请指教,谢谢。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-11-01 15:05 |只看该作者
vm=`vmstat 1 2`
ifs=$IFS
IFS=
echo $vm > urfile
IFS=$ifs

论坛徽章:
0
3 [报告]
发表于 2007-11-01 15:08 |只看该作者
加上引号就行了 echo "$vm" >> $file

论坛徽章:
0
4 [报告]
发表于 2007-11-01 15:14 |只看该作者
vmstat 1 2 >>$file

论坛徽章:
0
5 [报告]
发表于 2007-11-01 15:16 |只看该作者
原帖由 xlife 于 2007-11-1 15:02 发表
我是bash,我写个简单脚本,把vmstat的结果保存到文件中,其中有句vm=`vmstat 1 2`,然后 echo $vm >> $file,但我打开$file发现vmstat的结果,本该四行的确没有分行,全部堆在一行,这是为什么,我该如何让他换 ...

#!/bin/bash

#author YiBin.Shen
#platform: CentOS
#you should install sysstat-XXXX.rpm to enable iostat,sar tools
#and sendmail service must have been installed

#Global variable

ADMIN=yibin.shen@infowarelab.com
IP=`ifconfig eth0 | awk '/inet addr/ {print $2}' | sed 's/.*:\(.*\)/\1/'`
INT=60

# if need ,use email function to send mail
email()
{
N=`ps aux | grep "sendmail" | grep -v \grep | wc -l`

if [ "$N" -eq 0 ] ; then
        service sendmail start
        wait
else
        if [ "$2" = vmstat ] ; then
                vmstat 5 2 | sed -n '3!p' | \
awk '{print ;print "\n"}' | mail -s ${IP} -v $1

        elif [ "$2" = iostat ] ; then
                iostat 5 2 | sed -n '18,19p' | \
sed '$!N;s/\n/&&/' | mail -s ${IP} -v $1

        elif [ "$2"  = uptime ] ; then
                echo -e `date` "\n" `uptime` | \
mail -s ${IP} -v $1
        elif [  "$2" = free ] ; then
                free -m |mail -s ${IP} -v $1
        fi
fi
}

#if need,write log to local file
write_log()
{
        if [ "$1" = vmstat ] ; then
                vmstat 5 2 | sed -n '3!p' | \
awk '{print ;print "\n"}' >> /var/log/monitor.log.`date +%m%d`

        elif [ "$1" = iostat ] ; then
                iostat 5 2 | sed -n '18,19p' | \
sed '$!N;s/\n/&&/' >> /var/log/monitor.log.`date +%m%d`

        elif [ "$1"  = uptime ] ; then
                echo -e `date` "\n" `uptime` | \
>> /var/log/monitor.log.`date +%m%d`
        elif [  "$1" = free ] ; then
                free -m >> /var/log/monitor.log.`date +%m%d`
        fi
}

#main loop
while : ;
do

#uptime:if avarage load is greater than 20,send a mail to admin.
        LOAD=$(echo $(uptime) | awk -F':' '{if ( $5 ~ /\.[0-9]+/ ) print $5 ; \
else print $4}' | sed 's/  *//g'| awk -F. '{print $1}')

        if [ "$LOAD" -gt 20 ] ; then
#                email ${ADMIN} "uptime"
                write_log "uptime"
        fi

#CPU_idle:use SAR or VMSTAT command to monitor idle cpu,
# if cpu_idle is less than 10%,send a mail to admin,
#CPU_IDLE=`sar -u | awk '/Average/ {print $NF}' | sed 's/\(.*\)\.../\1/'`
        CPU_IDLE=`vmstat 5 2 | sed -n '4p' | awk '{print $15}'`
        if [ "$CPU_IDLE" -lt 80 ] ; then
#                email ${ADMIN} "vmstat"
                write_log "vmstat"
        fi
#I/O: use iostat command to monitor disk's I/O
#if write speed is greater than 80000k/sec,
#or reader speed is greater than 60000k/sed,
#send a mail to admin
        IO_STATE=`iostat 5 2| sed -n '/^Device/N;s/\n//p' | sed -n '2p'`
        IO_W=`echo ${IO_STATE} | awk '{print $9}' | sed 's/\(.*\)\..*/\1/'`
        IO_R=`echo ${IO_STATE} | awk '{print $8}' | sed 's/\(.*\)\..*/\1/'`

        if [ "$IO_W" -gt 80000 ] ; then
#                email ${ADMIN}  "iostat"
                write_log "iostat"
        fi
#mem:use free command to monitor system's memory
#
        SWAP_TOTAL=`free -m | awk '/Swap/ {print $2}'`
        SWAP_USED=`free -m | awk '/Swap/ {print $3}'`
        RATE=`echo "${SWAP_USED}*100/${SWAP_TOTAL}" | bc`
        if [ "$RATE" -gt 85 ] ; then
#                email ${ADMIN} "free"
                write_log "free"
        fi
        sleep ${INT}
done

#script finished



哈哈,我刚也在想这个问题呢,
我刚写的一个监控系统资源的脚本,写的比较烂,
将就着看下吧

[ 本帖最后由 BLZer 于 2007-11-1 15:20 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-11-01 16:05 |只看该作者
解决,非常感谢各位回复

论坛徽章:
0
7 [报告]
发表于 2007-11-02 01:34 |只看该作者
大家都有写这样类似脚本的经历啊。以前写过一个,大量的用临时文件,没有遇到楼主的问题。
post出来,见笑啦

  1. #!/bin/bash
  2. #script name:vmcol
  3. #script func:statistic the output of vmstat
  4. dive=60
  5. vmstat 2 60 > /var/info/tmp/_vmtmp
  6. AFILE=`date +%y%m%d`resultvm
  7. DIRE=/var/info/result/
  8. sed -e '2q' /var/info/tmp/_vmtmp >> $DIRE$AFILE
  9. grep -v "memory" /var/info/tmp/_vmtmp | grep -v "free" > /var/info/tmp/_vm2ndtmp
  10.         for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  11.         do
  12.                 summ=`awk '{ s=$'"$i"'+s } END { print s }' /var/info/tmp/_vm2ndtmp`
  13.                 av=`echo "scale=0;$summ/$dive"|bc -l`
  14.                 echo -ne "$av\t" >> $DIRE$AFILE
  15.         done
  16. echo >> $DIRE$AFILE
  17. > /var/info/tmp/_vm2ndtmp
  18. > /var/info/tmp/_vmtmp
  19. exit 0
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-11-02 01:37 |只看该作者
其实写这种性能监控的脚本很值得探讨。

论坛徽章:
0
9 [报告]
发表于 2007-11-02 14:53 |只看该作者
我也正在写这样的脚本,感觉是学习Shell很好的途径,目前采用gnuplot工具帮着生成了一些图表,感觉很好用。

论坛徽章:
0
10 [报告]
发表于 2007-11-02 17:51 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP