总结 usbtop 命令的非常具体的部分

总结 usbtop 命令的非常具体的部分

我在这个问题上已经取得了很大的进展,我已经能够过滤掉我需要的所有信息,但是当它归结为总结数字时,它运行但没有打印任何内容。

这就是我所拥有的。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 运行该命令。

相关内容