0

这是我正在使用的基本剪切语法:

[jay@webserver ~]$ ss -tn
State      Recv-Q Send-Q                                  Local Address:Port                                                 Peer Address:Port              
ESTAB      0      52                                      xxx.xx.xx.xx:xx                                                  xxx.xx.xx.xx:xx              
ESTAB      0      232                                     xxx.xx.xx.xx:xx                                                 xxx.xx.xx.xx:xx     

但是,当我尝试切割田野时,我没有得到适当的输出:

[jay@webserver ~]$ ss -tn | grep -v State | cut -d$'\t' -f3,4
ESTAB      0      36     xxx.xx.xx.xx:xx                 xxx.xx.xx.xx:xx              
ESTAB      0      68     xxx.xx.xx.xx:xx                 xxx.xx.xx.xx:xx  

我唯一能想到的是分隔符不是制表符,但在这种情况下,我怎么能得到我想要的输出?

4

4 回答 4

4

ss 的输出用空格分隔。我建议使用awk:

ss -tn | grep -v State | awk '{print $3,$4}'
于 2016-08-28T21:22:37.173 回答
3

如果您不介意使用awk,可以使用(这也节省了对 grep 的调用):

ss -tn | awk '$0!~/State/{print $3, $4}'
于 2016-08-28T21:23:19.553 回答
1

改为使用awk,默认情况下将一个或多个空白字符计为单个分隔符:

ss -tn | grep -v State | awk '{print $3,$4}'

此外,这是跳过第一行的更通用方法:

ss -tn | tail -n+2 | awk '{print $3,$4}'
于 2016-08-28T21:23:57.500 回答
0

这适用于我的机器。基本上,将 8 个空格中的每一个更改为制表符,删除其他空格。

ss -tn | unexpand -t 8 | tr $'\t' '|' |tr -d [:blank:] | tr '|' $'\t' | expand -t 1 | cut -f4- -d ' '

或者这个:

ss -tn | expand -t 1 | unexpand -t 8 | cut -f4- -d$'\t'
于 2016-08-28T23:15:53.113 回答