我正在使用 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/