【问题标题】:GREP - Search only in first n characters of each line, searching for number after special characterGREP - 仅在每行的前 n 个字符中搜索,在特殊字符之后搜索数字
【发布时间】:2014-05-04 16:02:21
【问题描述】:

我在这里的第一篇文章。

总而言之:我有一个 netstat 输出,在 Windows 中使用“netstat -an”命令,我想获得其中一列的最高编号。

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 个字符,并在“:”之后获得最高数字字符。

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

【问题讨论】:

    标签: grep numbers max output netstat


    【解决方案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}'
    

    【讨论】:

    • 你有多余的肩膀我可以借来哭吗?
    【解决方案2】:

    这可以是一种方法:

    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
    

    【讨论】:

    • 感谢您的帮助!!我将 fedorqui 的答案标记为正确,因为由于声誉,我无法将任何答案标记为有用,但我结合到我的解决方案中的是 fedorqui 和 Mark Setchell 的答案。
    【解决方案3】:

    我会选择这个:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你也可以单独使用 coreutils:

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

        输出:

        58000
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          • 2018-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多