GREP - 仅搜索每行的前n个字符,在特殊字符后搜索数字

时间:2014-03-26 10:18:17

标签: grep numbers max output netstat

我在这里的第一篇文章。

总结:我有一个netstat输出,使用" netstat -an" Windows中的命令,我想得到其中一列的最高编号。

netstat的输出是这样的:

  TCP    10.45.43.232:50387     10.42.48.61:902        ESTABLISHED
  TCP    10.45.43.232:50559     46.228.47.115:443      CLOSE_WAIT
  TCP    10.45.43.232:52501     10.48.48.128:3389      ESTABLISHED
  TCP    10.45.43.232:58000     10.46.48.243:63713     ESTABLISHED

我想要的结果是:

58000

这个数字是第二列的最大值,在"之后:"字符

所以,从本质上讲,我想要一个grep(和/或sed,awk等)可以搜索文件,只查看每行的前25个字符,并获得#34后的最高数字;:"字符。

如果您需要更多信息,请告诉我,提前谢谢!

5 个答案:

答案 0 :(得分:1)

如果输出有前导空格/标签:

netstat...|awk -F':|\\s*' '{p=$4>p?$4:p}END{print p}'

如果没有前导空格:

netstat ..| awk -F':|\\s*' '{p=$3>p?$3:p}END{print p}'

答案 1 :(得分:1)

这可以是一种方法:

netstat ... | sort -t':' -nrk2 | awk -F"[ :]" '{print $8; exit}'

分段:

根据:作为分隔符对其进行排序,并考虑第二列:

$ netstat ... | sort -t':' -nrk2
  TCP    10.45.43.232:58000     10.46.48.243:63713     ESTABLISHED
  TCP    10.45.43.232:52501     10.48.48.128:3389      ESTABLISHED
  TCP    10.45.43.232:50559     46.228.47.115:443      CLOSE_WAIT
  TCP    10.45.43.232:50387     10.42.48.61:902        ESTABLISHED

打印最大的:

$ netstat ... | sort -t':' -nrk2 | awk -F"[ :]" '{print $8; exit}'
58000

或者更好,使用Mark Setchell's approach获取最后一项:

$ netstat ... | sort -t':' -nrk2 | awk '{sub(/.*:/,"",$2); print $2; exit}'
58000

答案 2 :(得分:1)

我会这样做:

netstat -an | awk '{sub(/.*:/,"",$2); if($2>max)max=$2} END{print max}'

sub()部分从第二个字段中删除所有字符,包括冒号,从而提取端口。如果大于max,则max会更新。最后,打印max

答案 3 :(得分:1)

这是使用GNU awk的另一种方式:

netstat ... | awk '{split($2,tmp,/:/); a[tmp[2]]++}END{n=asorti(a);print a[n]}' 
  • 我们将第二列的第二个字段(由:分隔)拆分为tmp数组
  • 我们在数组keys中将值填充为a
  • END我们使用GNU awk asorti函数sorts keys并打印最高版本。

答案 4 :(得分:0)

您也可以单独使用coreutils:

netstat ... | cut -d: -f2 | cut -d' ' -f1 | sort -nr | head -n1

输出:

58000