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

cle*_*ion 3 linux bash grep

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

netstat -ant|grep LISTEN|grep 80|wc -l
Run Code Online (Sandbox Code Playgroud)

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

Dav*_* W. 6

我正在查看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     
Run Code Online (Sandbox Code Playgroud)

我认为端口是五部分虚线输出中的最后一个数字.这意味着

grep "\.80 " 
Run Code Online (Sandbox Code Playgroud)

将只接收80号港口.\.说要接受这段时间.(通常句点表示正则表达式中的任何字符).并且,通过在后面放置一个空格80,您将保证您不会选择端口8080.事实上,您可以保证您不会获取其中包含的IP地址.80.

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

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /\.80$/' | wc -l
Run Code Online (Sandbox Code Playgroud)

awk每一列自动成为一个单独的字段.域#6($ 6 AWK)是一个说ESTABLISHED,CLOSED,LISTEN在它.Field $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
          }
      }'
Run Code Online (Sandbox Code Playgroud)

附加物

OP获得以下输出:

tcp       0      0  0.0.0.0:8080        0.0.0.0:*       LISTEN
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请尝试:

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /:80$/' | wc -l
Run Code Online (Sandbox Code Playgroud)

哪里\.被一个:或...... 取代

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[\.:]80$/' | wc -l
Run Code Online (Sandbox Code Playgroud)

[\.:]无论是冒号还是句号,哪种用途都能得到它.哎呀,不妨一路走下去......

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[^0-9]80$/' | wc -l
Run Code Online (Sandbox Code Playgroud)

[^0-9]意味着不是数字字符.你不能错.这样,无论是句号,冒号,分号,逗号,还是您netstat使用的版本的任何分隔符,都可以.