【问题标题】:Join and process two lines from top command output加入并处理 top 命令输出中的两行
【发布时间】:2011-12-16 02:50:52
【问题描述】:

我想加入并处理来自 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

【问题讨论】:

    标签: linux bash sed awk top-command


    【解决方案1】:

    试试这个:

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

    首先读取秒行,然后将“top -”替换为“Time:”,最后删除从第一个换行符开始的所有内容。

    输出:

    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=""}'
    

    【讨论】:

    • 您的命令最初也没有产生任何输出。我了解到输出是在填充一定数量的缓冲区后写入的。有没有办法控制 sed 的缓冲时间或者行数,让输出打印的更规律?
    • 谢谢@Chris。它使用 awk 命令无延迟地显示到屏幕上,但是当我输出到文件并拖尾时,它仍然一次不输出一行。这不是那么重要,但我仍然很好奇导致缓冲的原因以及如何避免它?
    【解决方案2】:

    这可能有效:

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

    sed -u 选项显然从输入文件中加载最少量的数据并更频繁地刷新输出缓冲区。 我只有 Top 的 Busybox 版本,所以我猜它会起作用。

    【讨论】:

    • 谢谢@potong。我已经尝试过你的建议,但是 -u 选项对缓冲问题没有帮助。我也没有得到想要的输出,我用你的命令得到了这个:Time: 15:25:20 Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie.
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多