如何从Bash脚本命令的实时输出中提取某些字段

4

我想从命令xentop的输出中提取一些字段。它类似于top命令;实时提供CPU使用情况、内存使用情况等。 如果我以批处理模式运行此命令,我将会在文件中看到其输出:

      NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR  VBD_RSECT  VBD_WSECT SSID
  Domain-0 -----r      13700   33.0    7127040   85.9   no limit       n/a     8    0        0        0    0        0        0        0          0          0    0
     fed18 -----r        738  190.6    1052640   12.7    1052672      12.7     3    1   259919     8265    1        0    82432    22750    2740966    1071672    0

并且运行这个

cat file| tr '\r' '\n' | sed 's/[0-9][;][0-9][0-9][a-Z]/ /g' | col -bx | awk '{print $1,$4,$6}'

这个文件让我得到了想要的内容。
NAME CPU(%) MEM(%)
Domain-0 33.0 85.9
fed18 190.6 12.7

但是我的脚本不能处理xentop的实时输出。 我甚至尝试了将xentop的迭代选项设置为1(xentop -i 1)仅运行一次,但是它仍然不起作用! 我该如何将xentop的输出作为“非”实时流传递给我的脚本?

那么使用“xentop -b”管道有什么问题呢? - cnicutar
我没有 xentop,但我稍微使用了一下 top。 如果我运行 top -b | ...(filtering),我也得不到任何东西,但我可以执行 top -b > foo.txt 然后 cat foo.txt | ... 并且那样可以工作(就像你观察到的 xentop)。 如果我运行 top -b -n 1 | ...(filtering),那么它符合描述。 对于 xentop 就是 xentop -b -i 1 | ...。 不确定这可能会给你留下什么,但请尝试 xentop -b -i 1 | ...,如果可以工作,那么您可以定期调用它以更新数据。 - lurker
3
问题在于topxentop实际上是为控制台定期输出而设计的,不是为脚本输出到文件而设计的。如果你想将周期性的输出写入文件,为什么不从脚本中定期调用带有适当选项的ps并将其过滤到文件中呢? - lurker
1
我敢打赌,你可以使用 snmpwalkxentop 中提取出所有你想要的信息。 - Red Cricket
@MBRATCH: 我知道!我的意思是,在虚拟化中,我不想依赖于客户机本身,我希望主机能够独立获取客户机的统计信息,xentop可以做到。它不必在客户机系统上运行,我在主机系统上运行它以获取客户机的统计信息。 - Peggy
显示剩余4条评论
2个回答

0

我在 XenServer 7.0 上使用 xentop 1.0 版本,类似于:

[root@xen] xentop -V
xentop 1.0

[root@xen] cat /etc/centos-release
XenServer release 7.0.0-125380c (xenenterprise)

如果您想保存xentop输出,可以使用“-b”(批处理模式)和“-i”(退出之前的迭代次数)选项:
[root@xen] xentop -b -i 1
NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR  VBD_RSECT  VBD_WSECT SSID
Domain-0 -----r     132130    0.0    4194304    1.6    4194304       1.6    16    0        0        0    0        0        0        0          0          0    0
MY_VM --b---       5652    0.0   16777208    6.3   16915456       6.3     4    0        0        0    1        -        -        -          -          -    0 

[root@xen] xentop -b -i 1 > output.txt
[root@xen] cat output.txt
NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR  VBD_RSECT  VBD_WSECT SSID
Domain-0 -----r     132130    0.0    4194304    1.6    4194304       1.6    16    0        0        0    0        0        0        0          0          0    0
MY_VM --b---       5652    0.0   16777208    6.3   16915456       6.3     4    0        0        0    1        -        -        -          -          -    0 

0

它可能不会将任何输出发送到标准输出流。有几种方法可以在不使用stdout的情况下将输出发送到屏幕上。快速的谷歌搜索并没有提供太多关于其内部工作原理的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接