如下脚本,通过where cmdlet过滤出来netstat中已连接状态的连接:
可以发现, 使用字符串的split选项可以凑效,但是,使用字符串的split方法不能凑效; 因为split选项支持正则分隔符,split方法不支持正则分隔符,其实第二种写法是不对的。split方法只能按照单个字符分隔
参考: https://msdn.microsoft.com/en-us/library/System.String.Split(v=vs.110).aspx
统计每种tcp状态的数量:
1 2 3 4 5 6 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr} Name Value ---- ----- LISTEN 2 ESTABLISHED 2 |
其中,begin、end都很类似awk的用法
改进: 如何按照名字的升序进行输出呢:
1 2 3 4 5 6 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr.GetEnumerator()|Sort-Object -Property name } Name Value ---- ----- ESTABLISHED 2 LISTEN 2 |
注意这里sort的使用,需要使用 GetEnumerator(), 因为$arr 本身是一个大对象,本没有迭代为多个对象输出,是不会被sort的,所以需要$arr.GetEnumerator() ,然后输出给sort
tips: sort的 -Property 可以不写,直接 sort name (或)sort value
格式化输出:
1 2 3 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr.GetEnumerator()|foreach {$_.name +":"+ $_.value} } LISTEN:2 ESTABLISHED:2 |