从打印输出中的特定列剪切部分元素

时间:2016-02-23 07:52:35

标签: linux bash shell awk

有一段时间我一直在使用一个简单的命令从netstat中提取数据,以显示服务器与特定IP的连接数。

我现在正在尝试迁移该命令,同时使用ss添加更多细节,但我对如何从特定列中删除某个元素感到有些困惑。

到目前为止我的内容如下:

ss -t 2>/dev/null | awk -v OFS='\t\t' '{print $4, $5}' | sort | uniq -c | sort -nr

这将输出类似于:

的内容
  1 Local                           Address:Port
  1 172.31.6.21:imaps               124.170.xxx.xxx:47498
  1 172.31.6.21:imaps               124.170.xxx.xxx:47122

我遇到的问题是我无法弄清楚如何获取忽略“:Port”因素的每个源IP的合并值。我已经尝试使用cut命令做了一些事情,但这也影响了第一列,因此输出不如所希望的那样精确。

我希望能够看到的输出类型是:

  1  Local                           Address:Port
  22 172.31.6.21:imaps               124.170.xxx.xxx
  31 172.31.6.17:http                134.162.xxx.xxx

本地IP,协议类型和源IP是结果中最重要的。我想删除port元素,这样当我使用sort函数时,我可以看到特定源IP中特定协议的特定本地IP的连接数。

2 个答案:

答案 0 :(得分:0)

这会吗?

ss -t 2>/dev/null | awk -v OFS='\t\t' '{print $4, $5}' | cut -f1,2 -d ":" | uniq | sort | uniq -c | sort -nr

更新:抱歉,没有注意到关于第一栏的评论。

更新2:添加" uniq",这应该可以解决问题。

答案 1 :(得分:0)

ss -t 2>/dev/null | awk '{
        gsub('/:.[^:]*$/',"",$NF);
        if(NR!=1){
            a[$4" "$5]+=1
        }else{
            print "Count LocalAddress:Port PeerAddress"
        }
    }
    END{
        for (i in a) {
            print a[i],i
        }
    }' | column -t

使用gsub剪切最后一部分以省略$5的端口。然后创建一个索引为a的数组$4" "$5,并在索引相同时递增数组值。 最后打印数组索引以及广告数组值。管道到column -t以获得漂亮的O / P