解析 nethogs
我正在尝试解析的输出nethogs-d 1 -t为以下格式:
5.65273 767.912
14.2687 1681.15
19.9011 2309.54
其中第一(或第二)列代表全部的我的机器发送(或接收)的 KB/秒数。每条线都是以 1 秒的间隔进行的测量(-darg)。
到目前为止我的尝试
通过跑步
sudo nethogs -d 1 -t
我得到以下原始输出
Adding local address: 192.168.0.23
Adding local address: fe80::cb1b:6973:f77f:34
Ethernet link detected
Waiting for first packet to arrive (see sourceforge.net bug 1019381)
Refreshing:
unknown TCP/0/0 0 0
Refreshing:
/usr/lib/firefox/firefox/12576/1000 4.07988 543.749
/opt/google/chrome/chrome/2441/1000 1.57285 224.163
unknown TCP/0/0 0 0
Refreshing:
/usr/lib/firefox/firefox/12576/1000 11.9787 1330.22
/opt/google/chrome/chrome/2441/1000 2.26895 350.36
unknown TCP/0/0 0 0
Refreshing:
/usr/lib/firefox/firefox/12576/1000 17.6111 1958.61
/opt/google/chrome/chrome/2441/1000 2.26895 350.36
unknown TCP/0/0 0 0
通过运行命令
sudo nethogs -d 1 -t 2>&1 | sed '1,5d;/Refreshing:/d;s_\t_ _g'
我能够产生更干净的输出,类似于
unknown TCP/0/0 0 0
/usr/lib/firefox/firefox/12576/1000 4.07988 543.749
/opt/google/chrome/chrome/2441/1000 1.57285 224.163
unknown TCP/0/0 0 0
/usr/lib/firefox/firefox/12576/1000 11.9787 1330.22
/opt/google/chrome/chrome/2441/1000 2.26895 350.36
unknown TCP/0/0 0 0
/usr/lib/firefox/firefox/12576/1000 17.6111 1958.61
/opt/google/chrome/chrome/2441/1000 2.26895 350.36
unknown TCP/0/0 0 0
现在我该如何从这个转到我想要的输出?我尝试使用awk 像这样对一次测量的输出求和
sudo nethogs -d 1 -t 2>&1 | sed '1,5d;/Refreshing:/d;s_\t_ _g' | awk 'BEGIN{sent=0; recv=0;};{if (NF >= 2) sent+=$(NF-1); recv+=$NF;}; END{print sent, recv;};'
但这不会产生任何输出。我可以把输出sed在文件中然后应用awk对于每个段落,但我觉得有一种更直接的方法可以做到这一点,并且可以为我提供我更喜欢的连续输出。
答案1
只需考虑以斜杠开头或不以斜杠开头的行:
$ awk '/^[/]/ { sent+=$(NF-1); recv+=$NF }
/^[^/]/ && sent>0 && recv>0 { print sent, recv; sent = recv = 0 }' file
5.65273 767.912
14.2477 1680.58
19.8801 2308.97
这只是添加到以斜杠字符开头的行sent
或recv
从以斜杠字符开头的行添加。当遇到不以斜杠字符开头的行时,将输出当前累加的sent
和recv
值(然后重置为零)。仅当变量包含大于零的值时才会发生输出。