簡體   English   中英

如何grep監聽端口80,也可以過濾其他端口包含80如8080 8088 ...?

[英]how to grep listening on port 80 that can also filter other port contain 80 such as 8080 8088 …?

如果任何進程正在偵聽端口80,我想使用bash grep,但現在我偶然發現了其他令我煩惱的端口號。 我怎樣才能在grep中過濾這個?

netstat -ant|grep LISTEN|grep 80|wc -l

它還輸出其他記錄,如8080 8088等。

我正在查看我的netstat命令的輸出,看到這個:

tcp4       0      0  10.0.1.10.56941        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56936        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56932        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56929        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56922        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56914        64.34.119.101.80       ESTABLISHED
tcp4       0      0  *.*                    *.*                    CLOSED     
tcp46      0      0  *.80                   *.*                    LISTEN     
tcp4       0      0  127.0.0.1.49153        *.*                    LISTEN     
tcp4       0      0  127.0.0.1.49152        *.*                    LISTEN     
tcp4       0      0  *.631                  *.*                    LISTEN     
tcp6       0      0  *.631                  *.*                    LISTEN     

我認為端口是五部分虛線輸出中的最后一個數字。 這意味着

grep "\.80 " 

將只接收80端口。 \\. 說拿起這個時期。 (通常句點表示正則表達式中的任何字符 )。 並且,通過在80之后放置一個空格,您將保證您不會選擇端口8080.事實上,您可以保證您不會選擇其中包含.80 IP地址。

事實上,我建議使用awk而不是grep 使用awk ,您可以指定字段並進行更多處理:

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /\.80$/' | wc -l

使用awk每列自動成為一個單獨的字段。 字段#6(awk中的$ 6)是其中包含ESTABLISHEDCLOSEDLISTEN字段。 字段$4是第一列IP地址。

在上面,我正在尋找在第六個字段中有單詞LISTEN的行,並且字段#4匹配正則表達式\\.80$ $是字符串末尾的錨點和\\. 正在拾取一個小數點並且不代表任何字符。 awk命令自動打印出匹配的每一行,所以我不必指定它。

Awk實際上是一種編程語言。 它假定文件中每行的讀循環。 您可以擁有一個在讀取文件之前執行的BEGIN子句和一個在讀取文件后執行的END子句。 各個字段都有編號,並以美元符號表示。 特殊的$0變量代表整行。 像NF這樣的特殊變量可以為你提供一行中的字段數,NR可以為你提供讀入的行數。你還有一大堆函數可以幫助解析文本等等。這是awk腳本的完整版本。基本上為你布置了一切,並自己進行行計數,所以你不必管道到wc -l

$ netstat -ant | awk '
      BEGIN {total = 0}
      END {print "There are " total " lines I found"}
      {
          if ($6 == "LISTEN" && $4 ~ /\.80$/) {
              total = total + 1
          }
      }'

附加物

OP獲得以下輸出:

tcp       0      0  0.0.0.0:8080        0.0.0.0:*       LISTEN

在這種情況下,請嘗試:

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /:80$/' | wc -l

在哪里\\. 被...替換為:或...

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[\.:]80$/' | wc -l

使用[\\.:]將獲得它無論是冒號還是句號。 哎呀,不妨一路走下去......

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[^0-9]80$/' | wc -l

[^0-9]表示不是數字字符。 你不能錯。 這樣,無論是句點,冒號,分號,逗號,還是netstat版本使用的任何分隔符,都可以。

而不是grepping netstat的輸出 - 要求提供超出你需要的信息然后丟棄它的大部分 - 只需要詢問fuser哪個進程有你關心的端口打開:

$ fuser -n tcp 4005
4005/tcp:            19339

如果您只關心是否有任何進程打開了相關端口,您可以更快速有效地執行此操作,而無需根據fuser使用-q參數並對其退出狀態進行操作來處理輸出:

if fuser -q -n tcp 4005 ; then
    echo "port is in use"
else
    echo "port not in use"
fi

如果您想知道遠程端口有多少連接,熱熔器也可以這樣做:

fuser -n tcp ,,80

...或與特定主機上的遠程端口的連接:

fuser -n tcp ,1.2.3.4,80

簡而言之 - 使用正確的工具來查詢您想要的參數直接阻止您首先需要進行基於文本的過濾。

使用grep ":80 "而不是grep 80

您可以利用端口前面有冒號(如:80 )這一事實。 那么禁食就像是:

netstat -ant | grep ':80\b.*LISTEN'

這樣你就不會兩次調用grep了。 此外,grep能夠使用-c計算匹配,因此您可以使用它來代替wc

netstat -ant | grep -c ':80\b.*LISTEN'

您搜索的命令是: netstat -ntpl | grep ':PORT ' netstat -ntpl | grep ':PORT '

例:

$ netstat -ntpl | grep ':80 '
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12960/nginx -g daem
tcp6       0      0 :::80                   :::*                    LISTEN      12960/nginx -g daem

如果你想讓它更強大,你可以做到

netstat -ant |egrep  "^tcp +[[:digit:]]+ +[[:digit:]]+ +[[:digit:]\.]+\:80 +.*LISTEN *$"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM