现在我的目标是扫描单个 ip 并仅获取以逗号分隔的单行打印的开放端口。 下面的代码做到了这一点,但它在最后注入了 % 目标是在单行中实现端口号作为输出,而无需最后 2 个字符(最后一个逗号和 % 符号)
sudo nmap -vv -sS 10.129.208.16 -oG - | awk -v OFS=':' '
/open/ {
for (i=4;i<=NF;i++) {
split($i,a,"/");
if (a[2]=="open") {printf a[1]","}
}
}'
输出:
21,22,53,80,139,443,445,%
所需输出:
21,22,53,80,139,443,445
通过使用
printf
{printf a[1]","}
就像这样,如果
a[1]
持有模板并需要填充 1 个或多个位置,则您将面临故障风险,请考虑
echo "%s/%s" | awk '{split($0,a,"/");printf a[1]","}'
由于填充位置的值不足,将导致致命错误。更稳健的解决方案是自己提供模板
echo "120/60" | awk '{split($0,a,"/");printf("%s,",a[1])}' # outputs 120,
echo "%s/%s" | awk '{split($0,a,"/");printf("%s,",a[1])}' # outputs %s,
目标是获得端口号
为此,您可以添加条件检查
a[1]
是否为整数,并修复上述问题并给出代码
sudo nmap -vv -sS 10.129.208.16 -oG - | awk -v OFS=':' '
/open/ {
for (i=4;i<=NF;i++) {
split($i,a,"/");
if (a[2]=="open"&&a[1]~/^[0-9]+$/) {printf("%s,",a[1])}
}
}'
说明:仅当
printf
打开且 (a[2]
) &&
具有一个或多个 (a[1]
) 位数字 (+
) 时,从开始 ([0-9]
) 到结束 ( ^
)即 $
仅由数字组成,并且至少有 1 位数字。免责声明:由于缺少主要命令的输出,我无法测试。
如果您想了解更多关于
a[1]
用法的信息,请阅读
使用
printf
高级打印声明