2011-10-26 30 views
1

两行我想加盟和处理两条线出来top命令:加入和工艺从top命令输出

shell> top -p 1 -b -d 1 | egrep '^top|^Cpu' 
top - 15:17:45 up 736 days, 4:32, 3 users, load average: 0.06, 0.03, 0.00 
Cpu(s): 0.7% us, 0.8% sy, 0.0% ni, 97.1% id, 1.3% wa, 0.0% hi, 0.0% si 

当试图用awk和sed命令,我遇到了麻烦 - 没有产出。什么命令我会用得到的输出看起来像这样:

Time: 15:17:45 Cpu(s): 0.7% us, 0.8% sy, 0.0% ni, 97.1% id, 1.3% wa, 0.0% hi, 0.0% si 

下面是一段代码,可能是有用的:

shell> echo 'top - 15:17:45 up 736 days, 4:32, 3 users, load average: 0.06, 0.03, 0.00' | awk -F' up' '/^top/ {print "Time: " $1}' | sed 's/top - //' 
Time: 15:17:45 

回答

1

试试这个:

command | sed -n "N;s/top - /Time: /;s/up.*\n//;p" 

在首先读取第二行,然后用“Time:”代替“top - ”,最后删除从第一行开始的所有内容。

输出:

Time: 15:17:45 Cpu(s): 0.7% us, 0.8% sy, 0.0% ni, 97.1% id, 1.3% wa, 0.0% hi, 0.0% si 

编辑:

试试这个:

top -p 1 -b -d 1 | awk ' 
    /^top/{a=$0} 
    /^Cpu/{ 
     sub(/top - /,"Time:",a); 
     sub(/up.*$/,"",a); 
     printf "%s %s\n",a,$0;a=""}' 
+0

您的命令最初也没有产生任何输出。我了解到输出是在填充了一定数量的缓冲区后写入的。有没有办法控制sed的缓冲时间或行数,所以输出更经常打印? – dabest1

+0

看到我编辑的答案。这应该工作。 – Chris

+0

谢谢@Chris。它通过awk命令在没有延迟的情况下显示到屏幕上,但是当我输出到文件并拖放它时,它仍然不会一次输出一行。这不是那么重要,但我仍然很好奇导致缓冲的原因以及如何避免它。 – dabest1

0

这可能会实现:

top -bn1 |sed -ru '1!d;N;s/^top -\s*(\S*).*\n/Time: \1 /' 

桑达-u选项显然加载极少量的来自i的数据输入文件并更频繁地刷新输出缓冲区。 我只有Busybox版本的顶部,所以我猜测它会工作。

+0

谢谢@potong。我试过了你的建议,但-u选项对缓冲问题没有帮助。我也没有得到所需的输出,我用你的命令得到了这个结果:'时间:15:25:20任务:共162次,1次运行,161次睡眠,0次停止,0次僵尸。 – dabest1