2011-04-04 66 views
2

之前的一切,我有以下几点:庆典删除字符

netstat -tuna | awk '{ print $4; }' | sed -e '1,2d' 

返回:字符:

10.20.26.143:51697 
10.20.26.143:51696 
10.20.26.143:51698 
10.20.26.143:51693 
10.20.26.143:51695 
10.20.26.143:51694 
:::22 
0.0.0.0:68 
0.0.0.0:49625 
0.0.0.0:5353 
:::48727 
:::5353 

返回所有开放端口的列表..如何将我的之前删除一切吗?请注意几个:::而不是: 我只想让它返回端口,删除最后的所有文本:

我希望它在一个bash命令中。

非常感谢!

回答

2

只需用一个awk命令来完成。无需链太多

netstat -tuna | awk 'NR>2{ k=split($4,a,":");print a[k] }' 

netstat -tuna | awk 'NR>2{ sub(/.*:/,"",$4);print $4 }' 

或Ruby(1.9+)

如果你想唯一的端口
netstat -tuna | ruby -ane 'puts $F[3].sub(/.*:/,"") if $.>2' 

netstat -tuna | awk 'NR>2{ sub(/.*:/,"",$4); uniq[$4] }END{ for(i in uniq) print i }' 
+0

优秀的答案!非常感谢 – rmartinez 2011-04-04 23:51:27

1

因此很明显, you can tuna network, but you can't tuna fish

以下将打印的所有开放端口

netstat -tuna | awk -F':+| +' 'NR>2{print $5}' 

下面将打印所有独特开放的端口,即没有按升序排列

netstat -tuna | awk -F':+| +' 'NR>2{print $5}' | sort -nu 
3

分类重复添加到您的sed命令:

';s/.*:/:/g' 

netstat -tuna | awk '{ print $4; }' | sed -e '1,2d;s/.*:/:/g' 

应该可以工作。