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

标签 linux bash grep

如果有任何进程正在监听端口 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。事实上,您可以保证您不会获取 IP其中包含 .80 的地址。

事实上,我建议使用 awk 而不是 grep。使用 awk,您可以指定字段并进行更多处理:

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

使用 awk 时,每一列都会自动成为一个单独的字段。字段 #6(awk 中的 $6)是在其中显示 ESTABLISHEDCLOSEDLISTEN 的字段。字段 $4 是第一列 IP 地址。

在上面,我正在寻找在第六个字段中包含单词 LISTEN 的行,其中字段 #4 与正则表达式 \.80$ 匹配. $ 是字符串末尾的 anchor ,\. 取一个小数点而不代表任何字符。 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 版本使用的任何分隔符,它都可以使用。

关于linux - 如何 grep 监听端口 80 也可以过滤其他端口包含 80,例如 8080 8088 ...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10628972/

相关文章:

c - 多线程计算矩阵乘积的时间成本

bash - 如何使用 find -exec 递增?

bash - 如何从 bash 脚本中引用重定向文件?

linux - 在 linux 中使用 grep 将 xml 文件中包含的所有 url 传输到单独的文件

grep - 如何 grep 查找博客中的 URL?

c++ - 如何像 "top"linux 命令一样进行控制台输入?

mysql - Ubuntu:我无法正常运行 mysql 甚至无法重新安装它

linux - 我们可以创建具有其他用户和组所有权的文件或目录吗

c - 无法执行以字符 'U' 开头的脚本

sed - grep/sed : How to print *something* when nothing matches