6

如果有任何进程正在侦听端口 80,我想使用 bash 进行 grep,但现在我偶然发现了其他让我烦恼的端口号。如何在 grep 中过滤?

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

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

4

6 回答 6

8

我正在查看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)是其中显示ESTABLISHED,CLOSED的字段LISTEN。字段$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使用的任何分隔符,它都可以使用。

于 2012-05-17T02:54:42.140 回答
4

而不是 grepping 的输出netstat——询问比你需要的更多的信息,然后丢弃大部分信息——只需询问fuser哪个进程打开了你关心的端口:

$ fuser -n tcp 4005
4005/tcp:            19339

-q如果您只关心是否有任何进程打开了相关端口,则可以通过使用fuser 的参数并对其退出状态进行操作来更快、更有效地执行此操作,而根本不需要处理输出:

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

如果您想知道远程端口有多少连接, fuser 也可以这样做:

fuser -n tcp ,,80

...或连接到特定主机上的远程端口:

fuser -n tcp ,1.2.3.4,80

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

于 2012-05-17T03:03:07.283 回答
3

使用grep ":80 "代替grep 80

于 2012-05-17T02:03:11.037 回答
2

您可以利用端口前面有一个冒号(如:80)这一事实。禁食的事情会是这样的:

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

这样你就不会调用grep两次。此外, grep 可以使用 计算匹配-c项,因此您可以使用它来代替wc

netstat -ant | grep -c ':80\b.*LISTEN'
于 2012-05-17T02:11:50.830 回答
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
于 2018-01-22T20:33:35.783 回答
0

如果你想让它更健壮,你可以这样做

netstat -ant |egrep  "^tcp +[[:digit:]]+ +[[:digit:]]+ +[[:digit:]\.]+\:80 +.*LISTEN *$"
于 2012-05-17T06:50:23.017 回答