2013-04-23 41 views
1

我需要在每個具有值的vmstat行中插入datetime。需要在每行vmstat輸出中插入datetime

我可以創建這樣一個功能:

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

然後調用的vmstat如下:

'vmstat 3 5 | insert_datetime' 

,但此行把日期時間的每一行,包括破折號( - )和任何有文字的行。我如何排除具有文字和文字的行?

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 

回答

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 
} 
+0

BTW執行,如果有的話,我建議你在管道的末端,如果你使用'column'命令想要更多的人可讀格式。它會給出更好的列表。 – anishsane 2013-04-23 14:30:21

+0

其實沒有。那些headears可以顯示在文件中間。我不能排除前3行。我需要能夠使用某種正則表達式來搜索 - 或[aA-zZ]爲每行排除它們。不需要爲這些行添加時間戳。 – user1471980 2013-04-23 14:36:31

+0

好的...我想看到一些解決方案...我不是很習慣ksh :( – anishsane 2013-04-23 14:42:56

2

使用awk

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

我想,這不是什麼OP想要的。請參閱他的第一個評論我的答案。 – anishsane 2013-04-23 14:57:43

+0

@anishsane Thanks for the heads up。Fixed。 – 2013-04-23 15:26:06

1

的sed可以給你的答案太...在更清潔&便攜式(跨殼)方式:

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

所有以數字開頭的行都以所需格式附加日期。

+0

我得到這個錯誤:sed:Function/^ * [0-9]。*/s /.*/ printf「&」; date「+%m-%d-% Y%H:%M:%S「/ e無法解析。 – user1471980 2013-05-22 13:51:20

+0

我知道,這並不好笑,但[它在我的系統上運行](http://www.buildsonmymachine.com/) – anishsane 2013-05-22 15:14:21

+0

在嚴肅的說明中,從來沒有看到這個錯誤消息「功能無法解析」從任何機會,你的系統是一個busybox外殼,只有基本功能?我有錯誤(D ifferent錯誤信息雖然)在一個基於最小版本sed的busybox上... – anishsane 2013-05-22 15:17:23

1

爲什麼不使用vmstat -t?這似乎正是你正在尋找的。下面是一些示例輸出

[[email protected] 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 

上CentOS6.3與procps的3.2.8

[[email protected] uptime]# vmstat -V 
procps version 3.2.8 
+0

@paulib,不知道你使用的是哪個操作系統。我在aix和vmstat -t不提供日期,只有時間。我需要兩個。 – user1471980 2013-05-22 13:49:02

+0

編輯回答回答您的問題。 – paullb 2013-05-23 04:27:00