在Bash脚本中提取sshd监听端口至数组的方法
提取sshd监听端口到Bash数组的几种方法
以下几种方式可以直接从你的portstr变量或一步到位提取端口并存入数组:
方法1:使用Sed正则提取
利用Sed的替换功能捕获冒号与空格之间的数字:
portarray=($(echo "$portstr" | sed -n 's/.*:\([0-9]*\) .*/\1/p'))
-n表示只打印匹配的行- 正则
.*:\([0-9]*\) .*匹配任意字符直到冒号,捕获后续的数字序列,再匹配后面的空格及剩余内容 \1引用捕获的数字部分,p打印结果
方法2:使用Awk字段拆分
Awk可以按分隔符拆分字段,适配lsof的输出格式:
portarray=($(echo "$portstr" | awk -F'[: ]' '{print $9}'))
-F'[: ]'指定分隔符为冒号或空格- 第9个字段恰好对应你给出的
lsof输出中的端口号
如果要适配不同格式的lsof输出,更通用的写法是拆分最后一个字段:
portarray=($(echo "$portstr" | awk '{split($NF, port_part, /[: ]/); print port_part[2]}'))
$NF取每行最后一个字段(如TCP *:22 (LISTEN))split用冒号和空格拆分该字段,取第二个元素即为端口
方法3:使用Grep的PCRE模式(需GNU Grep)
启用Perl兼容正则表达式,精准匹配端口部分:
portarray=($(echo "$portstr" | grep -oP ':\K\d+(?= )'))
-o只输出匹配的部分,-P启用PCRE:\K忽略前面的冒号,\d+(?= )匹配后面跟着空格的数字序列
一步到位(无需先存portstr)
直接整合lsof过滤与端口提取,避免中间变量:
portarray=($(lsof -i -P -n | awk '/LISTEN/ && /sshd/ {split($NF, p, /[: ]/); print p[2]}'))
验证结果
执行完上述任意命令后,可通过以下命令查看数组内容:
echo ${portarray[0]} # 输出22 echo ${portarray[1]} # 输出22
内容的提问来源于stack exchange,提问作者Shaun.M
相关产品推荐
相关产品推荐

