需要在vmstat输出的每一行中插入日期时间

时间:2013-04-23 14:22:25

标签: perl bash ksh

我需要在每个有值的vmstat行中插入日期时间。

我可以创建一个这样的函数:

function insert_datetime {
  while read line
  do
    printf "$line"
    date '+ %m-%d-%Y %H:%M:%S'
  done
}

然后按如下方式调用vmstat:

'vmstat 3 5 | insert_datetime'

但是这一行将日期时间放到每一行,包括短划线( - )和任何有文本的行。如何排除具有dahses和text的行?

kthr    memory              page              faults              cpu 04-23-2013 10:19:49
----- ----------- ------------------------ ------------ ----------------------- 04-23-2013 10:19:49
r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec 04-23-2013 10:19:49
0  0 45688088 4094129   0   0   0   0    0   0  45 12172 2840  1  1 99  0  0.35   2.2 04-23-2013 10:19:49
2  0 45694135 4088082   0   0   0   0    0   0 451 56350 21818  3  1 97  0  0.73   4.5 04-23-2013 10:19:52
1  0 45694137 4088061   0   0   0   0    0   0 303 24568 951  3  1 96  0  0.82   5.1 04-23-2013 10:19:55
1  0 45694138 4087739   0   0   0   0    0   0 445 9170 1504  2  0 98  0  0.64   4.0 04-23-2013 10:19:58
4  0 45703145 4078732   0   0   0   0    0   0 335 47175 1306  4  1 95  0  1.01   6.3 04-23-2013 10:20:01

我需要看起来像这样:

kthr    memory              page              faults              cpu
----- ----------- ------------------------ ------------ ----------------------- 
r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa    pc    ec 
0  0 45688088 4094129   0   0   0   0    0   0  45 12172 2840  1  1 99  0  0.35   2.2 04-23-2013 10:19:49
2  0 45694135 4088082   0   0   0   0    0   0 451 56350 21818  3  1 97  0  0.73   4.5 04-23-2013 10:19:52
1  0 45694137 4088061   0   0   0   0    0   0 303 24568 951  3  1 96  0  0.82   5.1 04-23-2013 10:19:55
1  0 45694138 4087739   0   0   0   0    0   0 445 9170 1504  2  0 98  0  0.64   4.0 04-23-2013 10:19:58
4  0 45703145 4078732   0   0   0   0    0   0 335 47175 1306  4  1 95  0  1.01   6.3 04-23-2013 10:20:01

4 个答案:

答案 0 :(得分:2)

使用awk

vmstat 3 5 | awk '/^ *[0-9]/{$0=$0 " " strftime("%m-%d-%Y %T")};1'

答案 1 :(得分:2)

为什么不使用vmstat -t?它似乎正是你在寻找的。这是一些示例输出

[root@web5 vmstat]# vmstat -t 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  15704 193236 189628 595868    9    3    25    16   15   20 11  1 88  1  0    2013-05-22 13:32:36 JST
 0  0  15704 193212 189628 595868    0    0     0     0   22   20  0  0 100  0  0   2013-05-22 13:32:37 JST
 0  0  15704 193212 189628 595868    0    0     0     0   19   12  0  0 100  0  0   2013-05-22 13:32:38 JST
 0  0  15704 193212 189628 595868    0    0     0     0   10   11  0  0 100  0  0   2013-05-22 13:32:39 JST
 0  0  15704 193212 189628 595868    0    0     0    96   34   25  0  1 99  0  0    2013-05-22 13:32:40 JST
 0  0  15704 193212 189628 595868    0    0     0     0   10    9  0  0 100  0  0   2013-05-22 13:32:41 JST
 0  0  15704 193212 189628 595868    0    0     0     0   14   23  0  0 100  0  0   2013-05-22 13:32:42 JST

使用procps 3.2.8在CentOS6.3上执行

[root@web5 uptime]# vmstat -V
procps version 3.2.8

答案 2 :(得分:1)

尝试:

function insert_datetime {
  while read line
  do
    printf "$line"
    if [[ "$line" =~ [0-9].* ]]; then 
       date '+ %m-%d-%Y %H:%M:%S'
    else
       echo
    fi
  done
}

答案 3 :(得分:1)

sed也可以给你答案......更清洁和更清洁便携式(跨壳)方式:

vmstat 3 5 | sed '/^ *[0-9].*/s/.*/printf "&";date "+ %m-%d-%Y %H:%M:%S"/e'

所有以数字开头的行都是所需格式的附加日期。