arrays - Bash - 将某些服务的端口号读入数组

标签 arrays bash grep port-number

我正在使用 grep 搜索端口号(在 bash 脚本中)

portstr=$(lsof -i -P -n | grep LISTEN | grep sshd)

portstr 现在看起来像这样

sshd       673            root    3u  IPv4  14229      0t0  TCP *:22 (LISTEN)
sshd       673            root    4u  IPv6  14231      0t0  TCP *:22 (LISTEN)

现在我想提取冒号(:)和后面的空格之间的数字,得到这样的东西

端口数组[0]=>22
portarray[1]=>22

谢谢

我试过了

    var="[a1] [b1] [123] [Text text] [0x0]"
    regex='\[([^]]*)\](.*)'
    while [[ $var =~ $regex ]]; do
      arr+=("${BASH_REMATCH[1]}")
      var=${BASH_REMATCH[2]}
    done

来自here 。但一切都没有真正成功。

最佳答案

您可以通过使用 [[:space:]]+| 将字段分隔符设置为 1 个或多个空格或冒号来使用 awk

检查第一个字段是否为sshd,最后一个字段是否为(LISTEN),然后打印倒数第二个字段:

portstr=$(lsof -i -P -n | awk -F"[[:space:]]+|:" '$1=="sshd" && $NF == "(LISTEN)" {print $(NF-1)}')
echo "$portstr"

对于 lsof -i -P -n 的输出为:

sshd       673            root    3u  IPv4  14229      0t0  TCP *:22 (LISTEN)
sshd       673            root    4u  IPv6  14231      0t0  TCP *:22 (LISTEN)

命令的输出:

22
22

阅读this page您可以将命令的输出放入数组中:

portarray=( $(lsof -i -P -n | awk -F"[[:space:]]+|:" '$1=="sshd" && $NF == "(LISTEN)" {print $(NF-1)}') )

for port in "${portarray[@]}"
do
   echo "$port"
done

关于arrays - Bash - 将某些服务的端口号读入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75274889/

相关文章:

string - 扩展双引号在 bash 中用三个反斜杠转义?

regex - 查找和删除 xml 文件中的特定标签

shell - Unix 目录问题

c++ - 默认堆栈大小

javascript - 如何在javascript中对嵌套对象数组进行排序

java - 使用另一个数组中的运算符计算数组的值

linux - 比较两个服务器之间的文件校验和并报告不匹配

bash - 如果设置了变量,运行命令的快捷方式

arrays - 从字典中获取键并将它们映射到数组

sed - 用于插入命令的复杂 sed 命令