linux下文本处理

硬盘采样:

sar -d 1 1
Linux 2.6.18-128.1.6.el5_lustre.1.8.0.1smp (cnode20) 01/02/2014


03:20:45 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
03:20:46 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:20:46 PM dev8-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:20:46 PM dev8-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:20:46 PM dev8-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00


Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00


想取出util的值,组成一个文件.

使用sed处理行, awk 处理列:

sar -d 1 1 | sed -n '4p'| awk '{ print $11;}' //4p表示第四行,$11表示11列
0.00

同样的:

sar -d 1 1 | awk 'NR==4{ print $11;}' NR表示第四行

0.00


但是以上都不是最好的方法,在网上搜了下,有个大拿写了处理脚本:http://www.51testing.com/html/00/130600-220288.html


#!/bin/bash
if (( $# != 2))
then
echo "usage:num1-Please enter the number of script. execution"
echo "usage:num2-Please enter a value for rest time"
exit 1
fi

sar -d 0 | head -3 | tail -1 > dev8-0.log
sar -u 0 | head -3 | tail -1 > cpu.log
sar -r 0 | head -3 | tail -1 > mem.log
echo "" > loadAverage.log
for ((i=1;i<=$1;i++))
do
sar -d1 | grep dev8-0 | grep -v Average >> dev8-0.log
sar -u1 | head -4 | tail -1 >> cpu.log
sar -r1 | head -4 | tail -1 >> mem.log
monitorDate=`date +'%F %T'`
load=`w | grep 'load average' | awk -F ',' {'print $4,$5,$6'}`
echo $monitorDate $load >> loadAverage.log
sleep $2
done


试了下效果不错,所以我自己照着写了一个:




#!bin/bash


for((i=1;i<4;i++)) //这里奇怪的是for循环为啥要加两层括号,单层就是不行。。。。
do
sar -d 1 |head -4 |tail -1 >>disk_io.log
done


结果:

03:37:36 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:37:37 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:37:38 PM dev8-0 1.98 0.00 23.76 12.00 0.01 1.00 2.00 0.40

你可能感兴趣的:(linux)