我在这个问题上已经取得了很大的进展,我已经能够过滤掉我需要的所有信息,但是当它归结为总结数字时,它运行但没有打印任何内容。
这就是我所拥有的。sudo usbtop
像这样吐出所有东西:
$sudo usbtop
Bus ID 0 (All USB buses) To device From device
Device ID 1 : 0.00 KiB/s 0.00 KiB/s
Device ID 5 : 119.42 KiB/s 29620.68 KiB/s
Device ID 7 : 133.55 KiB/s 30097.61 KiB/s
Device ID 8 : 146.48 KiB/s 30035.24 KiB/s
Device ID 11 : 403.09 KiB/s 116395.06 KiB/s
Device ID 13 : 145.12 KiB/s 30221.49 KiB/s
Device ID 15 : 402.34 KiB/s 116173.13 KiB/s
Device ID 17 : 408.02 KiB/s 117784.73 KiB/s
Device ID 22 : 402.31 KiB/s 116166.17 KiB/s
Device ID 24 : 402.57 KiB/s 116242.83 KiB/s
Device ID 25 : 402.62 KiB/s 116255.38 KiB/s
Device ID 26 : 14.44 KiB/s 7267.52 KiB/s
Device ID 27 : 14.44 KiB/s 7267.78 KiB/s
Device ID 28 : 12.08 KiB/s 6056.14 KiB/s
Bus ID 1 (USB bus number 1) To device From device
Device ID 1 : 0.00 KiB/s 0.00 KiB/s
Device ID 5 : 119.42 KiB/s 29620.57 KiB/s
Device ID 7 : 133.55 KiB/s 30098.21 KiB/s
Device ID 8 : 146.48 KiB/s 30035.24 KiB/s
Device ID 13 : 145.12 KiB/s 30221.49 KiB/s
Bus ID 2 (USB bus number 2) To device From device
Device ID 11 : 403.33 KiB/s 116470.63 KiB/s
Device ID 15 : 401.87 KiB/s 116056.23 KiB/s
Device ID 17 : 407.62 KiB/s 117657.41 KiB/s
Device ID 22 : 401.91 KiB/s 116032.60 KiB/s
Device ID 23 : 0.00 KiB/s 0.00 KiB/s
Device ID 24 : 401.93 KiB/s 116068.74 KiB/s
Device ID 25 : 402.19 KiB/s 116149.45 KiB/s
Device ID 26 : 10.49 KiB/s 4707.21 KiB/s
Device ID 27 : 11.77 KiB/s 5874.43 KiB/s
Device ID 28 : 13.06 KiB/s 6518.48 KiB/s
usbtop 与此 grep 管道过滤掉我需要的部分:
$sudo usbtop | grep -A 10 "Bus ID 2"
Bus ID 0 (All USB buses) To device From device
--
Bus ID 2 (USB bus number 2) To device From device
Device ID 11 : 390.70 KiB/s 112829.82 KiB/s
Device ID 15 : 167.34 KiB/s 48399.99 KiB/s
Device ID 17 : 397.52 KiB/s 114774.77 KiB/s
Device ID 22 : 389.77 KiB/s 112561.07 KiB/s
Device ID 24 : 390.87 KiB/s 112874.51 KiB/s
Device ID 25 : 336.29 KiB/s 97280.79 KiB/s
Device ID 26 : 13.07 KiB/s 6525.58 KiB/s
Device ID 27 : 13.60 KiB/s 6786.53 KiB/s
Device ID 28 : 11.35 KiB/s 5666.02 KiB/s
添加 awk 管道可以获得我需要的列,注意该列包含一些字符串:
sudo usbtop | grep -A 10 "Bus ID 2" | awk '{print $7}'
To
2)
116402.05
116149.45
116125.79
100062.28
118302.52
115981.20
6055.99
我可以通过添加 if 语句来过滤掉字符串:
sudo usbtop | grep -A 10 "Bus ID 2" | awk '{if ($1=="Device") print $7}'
116402.05
116149.45
116125.79
100062.28
118302.52
115981.20
6055.99
但此评论运行但不返回任何内容:
sudo usbtop | grep -A 10 "Bus ID 2" | awk '{if ($1=="Device") sum+=$7} END {print sum}'
我假设它要么陷入隐藏的字符串,要么不断地对传入的值求和而不会结束。我的问题是,如何让它打印我需要打印的内容?有没有更简单的方法来做到这一点?
答案1
我的解决方案
我找到了一个适用于这个问题的脚本。
sudo usbtop | grep -A 10 "Bus ID 2" | awk '{if ($1 == "Device") sum+=$7} (NR%12==0){avg=sum/12;print $7"\nTotal: "sum "\tAverage: "avg;sum=0;next}'
{if ($1 == "Device") sum+=$7}
如果 y 列中的值返回 true,则对 x 列中的行求和
(NR%12==0)
每 x 行计数
{avg=sum/12;print $7"\nTotal: "sum "\tAverage: "avg;sum=0;next}
{计算平均值;打印 x 列的内容;打印出计算结果;将总数重置为 0;并开始下一系列的计算}
我不需要所有这些信息,所以{"\nTotal: "sum;sum=0;next}
对我来说已经足够了。
通过 ssh 将其作为命令发送:
ssh -t domain@hostIP -a "sudo usbtop | grep -A 12 'Bus ID 2' | awk '{if(\$3>0) sum+=\$7/1000} (NR%10==0){print "'"Total: "'" sum;sum=0;next}'"
在本地运行命令之前,在哪里-t
打开终端会话并将-a
结果提取到您自己的计算机(我无法找到如何远程运行命令),请注意您必须转义嵌套引号和 $ 字符,因此" ' "
需要编写总计作为字符串,并\$
用于列引用。
作为输出到文件的 python 命令:
output_file = 'text.txt'
command = '''ssh -t domain@hostIP -a "usbtop | grep -A 10 'Bus ID 2' | awk '{if(\$3>0) sum+=\$7} (NR%10==0){print "'"Total: "'" sum;sum=0;next}'" >>''' + output_file
您可以编写sum+=\$7/1000
将 usbtop 输出转换为兆字节等。
注意:您可能必须以 root 身份通过 python 运行该命令。