2014-03-26 43 views
1

我的第一篇文章在這裏。GREP - 僅在每行的前n個字符中搜索,搜索特殊字符後的數字

總結:我有一個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個字符,並在「:」之後獲得最高數字。 「char ACTER。

如果您需要更多信息,請告訴我,提前致謝!

回答

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 
+1

感謝您的幫助! 我標記fedorqui答案是正確的,因爲我不能標記任何有用的名譽,但我結合我的解決方案的是fedorqui和馬克塞切爾的。 – user3463543

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

sub()部分將包含冒號的所有字符剝離,並從第二個字段中提取端口。如果這大於max,則更新max。最後,打印max

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函數其中sortskeys和打印最高。
0

您也可以單獨使用的coreutils做到這一點:

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

輸出:

58000