如何grep监听端口80,也可以过滤其他端口包含80如8080 8088 ...?

时间:2012-05-17 01:58:39

标签: linux bash grep

如果任何进程正在侦听端口80,我想使用bash grep,但现在我偶然发现了其他令我烦恼的端口号。我怎样才能在grep中过滤这个?

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

它还输出其他记录,如8080 8088等。

6 个答案:

答案 0 :(得分:5)

我正在查看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端口。事实上,你保证你不会回暖有IP地址其中.80

事实上,我建议您使用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给你读的行数的特殊变量。你也有功能的整体转换,以帮助解析文本,等这里的{{1一个完全成熟的版本基本上为你提供一切的脚本,并自己进行行计数,因此你不必管道到awk。:

wc -l

附记

OP获得以下输出:

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

在这种情况下,请尝试:

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]版本使用的任何分隔符,都可以使用。

答案 1 :(得分:4)

而不是点击netstat的输出 - 要求提供超出您需要的信息然后丢弃大部分信息 - 只需询问fuser哪个进程有您关心的端口:< / p>

$ fuser -n tcp 4005
4005/tcp:            19339

如果您只关心是否有任何进程打开了相关端口,您可以通过使用-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

简而言之 - 使用正确的工具来查询您想要的参数直接阻止您首先需要进行基于文本的过滤。

答案 2 :(得分:3)

使用grep ":80 "代替grep 80

答案 3 :(得分:2)

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

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

这样你就不会两次调用grep了。此外,grep可以计算与-c匹配的内容,因此您可以使用wc代替netstat -ant | grep -c ':80\b.*LISTEN'

{{1}}

答案 4 :(得分:1)

您搜索的命令是: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

答案 5 :(得分:0)

如果您希望它更强大,您可以

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