在几个不同的linux机器中,我必须计算tcp套接字连接的数量及其不同端口的状态。 最后,打印输出可能如下所示。
a.state
第一列是计数,第二列是ip:port,第三列是状态。
我想要做的是重新格式化输出,使其像这样
49570 10.10.10.10:13062 ESTABLISHED
783 10.10.10.10:18080 CLOSE_WAIT
493 10.10.10.10:18082 CLOSE_WAIT
109 10.10.10.10:18080 SYN_RECV
17 10.10.10.10:15062 TIME_WAIT
15 10.10.10.10:15062 ESTABLISHED
ip,不同于机器,也可能有更多端口,或更多状态,或更少。 有没有可能用awk实现这一点。有没有人有一个如何获得这个的例子。
抱歉,我很难粘贴所需的输入/输出结果,现在如上所述。 非常感谢提前。
答案 0 :(得分:1)
$ cat tst.awk
{
sub(/.*:/,"",$2)
ports[$2]
statuses[$3]
counts[$2,$3] = $1
for (i=1;i<=NF;i++) {
maxWidth[i] = (length($i) > maxWidth[i] ? length($i) : maxWidth[i])
}
}
END {
statusWidth = maxWidth[3]
otherWidth = (maxWidth[1] > maxWidth[2] ? maxWidth[1] : maxWidth[2]) + 2
printf "%-*s", statusWidth, ""
for (port in ports) {
printf "%*s", otherWidth, port
}
print ""
for (status in statuses) {
printf "%-*s", statusWidth, status
for (port in ports) {
printf "%*d", otherWidth, counts[port,status]
}
print ""
}
}
$ awk -f tst.awk file
13062 15062 18080 18082
SYN_RECV 0 0 109 0
CLOSE_WAIT 0 0 783 493
ESTABLISHED 49570 15 0 0
TIME_WAIT 0 17 0 0
答案 1 :(得分:0)
这是另一个 g awk-solution
matchesData = [str(v) if k == 'match_date' else v for k, v in enumerate(matchesData)]
输出(如果您想要空格而不是“\ t”作为分隔符,请将 awk -F"[: ]+" 'BEGIN{delim="\t"}
{ports[$3]; status[$3][$4]=$1; st[$4]}
END{str=delim
for(key in ports){str=str""delim""key}
print str
for(k in st){
str =k
for (key in ports) {
str = str""delim""(status[key][k] ? status[key][k] : 0)
}
print str
}
}' test.txt
更改为delim="\t"
):
delim=" "
对于此输入(即,没有前导空格的地方):
15062 13062 18080 18082
SYN_RECV 0 0 109 0
CLOSE_WAIT 0 0 783 493
ESTABLISHED 15 49570 0 0
TIME_WAIT 17 0 0 0