重新格式化输出打印

时间:2016-04-17 12:12:33

标签: linux awk formatting

在几个不同的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实现这一点。有没有人有一个如何获得这个的例子。

抱歉,我很难粘贴所需的输入/输出结果,现在如上所述。 非常感谢提前。

2 个答案:

答案 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