我需要的
我有一个现有的脚本,它提取域的端口信息并将其存储到一个名为portscan.txt
. 例子:
portscan.txt
文件:
somedomain.com:80
somedomain.com:443
我只想在满足某些条件时删除信息。这些条件包括:
- 包含域的文件应该有 2 行或更少的行
- 端口只能是 80 或 443(即,如果文件中存在 8080、8443 或任何其他端口,我不想删除该文件)。
注意:所以基本上,上面提供的示例文件应该被删除,但如果有 2 行,我不想删除该文件,但端口是 8080 或 8443(或任何其他端口) 示例如下:
somedomain.com:8443
somedomain.com:443
这不应该被删除。
我试过的
我尝试编写脚本,这就是我所拥有的:
#!/bin/bash
lines=$(cat portscan.txt | wc -l)
ports=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')
if [[ $lines < 3 ]] && [[ $ports != 80 ]]; then
if [[ $ports != 443 ]]; then
echo "I need to delete this"
fi
else
echo "I will NOT delete this..."
fi
这是脚本的第二次渲染,我尝试嵌套if语句,因为我无法执行这样的条件:
如果portscan.txt少于两行且端口不是80或443
我还尝试了一种更简单的方式,如下所示:
#!/bin/bash
lines=$(cat portscan.txt | wc -l)
ports=$(cat portscan.txt | grep -Pv '(^|[^0-9])(80|443)($|[^0-9])')
if [[ $lines < 3 ]] && (( $ports != 80||443 )); then
echo "I need to delete this"
else
echo "I will NOT delete this..."
fi
我已经尝试过,((
因为我读到这更好地与算术函数一起使用——这是我认为我需要的,但当它应该像这样时,我对条件参数并不那么精通:“这个和那个或那个”。
希望这是有道理的,任何帮助将不胜感激!
如果文件有第 3 行,或者如果它看到“非标准”端口,则该 awk 命令将以状态 0 退出。
如果函数返回非零(文件有 <= 2 行且只有“标准”端口),则打印 rm 命令。
echo
如果结果看起来正确,请删除。交替:
或者,更简洁地说
好的,试试这个
我遵循以下条件
matching
.感谢您给我这个编写 shell 代码的机会。
纯 bash 解决方案,封装在一个函数中并且易于阅读:
基于mapfile的解决方案:
要在 bash 中进行数字比较,您需要使用
-gt
,-lt
等。该<
符号用于标准输入重定向。您可以像对端口所做的那样将行号比较包含在 (( )) 中,或者使用
-lt
参见https://tldp.org/LDP/abs/html/comparison-ops.html