use*_*023 2 awk filtering sed nmap
我使用 NMAP,在大型网络上运行扫描以查看开放端口。输出文件是 2MB,但我想过滤掉所有关闭端口的 IP 地址。
Nmap scan report for 10.x.x.x
Host is up (0.048s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
Nmap scan report for 10.x.x.x
Host is up (0.046s latency).
All 1000 scanned ports on 10.x.x.x are closed
Nmap scan report for 10.x.x.x
Host is up (0.045s latency).
All 1000 scanned ports on 10.x.x.x are closed
Run Code Online (Sandbox Code Playgroud)
应该输出到只输出到:
Nmap scan report for 10.x.x.x
Host is up (0.048s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
Run Code Online (Sandbox Code Playgroud)
编辑
结果就像
Nmap scan report for 10.x.x.x
Host is up (0.048s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
Nmap scan report for 10.x.x.x
Host is up (0.046s latency).
All 1000 scanned ports on 10.x.x.x are closed
Nmap scan report for 10.x.x.x
Host is up (0.045s latency).
All 1000 scanned ports on 10.x.x.x are closed
Run Code Online (Sandbox Code Playgroud)
有没有正确复制的换行符
编辑 谢谢大家。我看到 awk 非常棒而且很容易做到。
在我看来,您正在尝试对 nmap 输出应用一些智能过滤,而不仅仅是简单的“grep”。
由于您的 nmap 命令(根据您的评论而不是您的问题)指向子网而不是单个主机,因此您需要单独解释输出的每个部分。但是这种解释对于正则表达式来说太复杂了。(使用 PREG 可能是可能的,但编写起来非常困难,而且几乎无法阅读。)像这样的工具awk是完成这项任务的更好选择。
例如:
nmap 10.10.0.0/16 | awk '
/^Nmap scan report for/ {
if (open) {
print output;
}
output="";
open=0;
}
{
output=output $0 "\n";
}
$2 == "open" {
open=1;
}
END {
if (open) {
print output;
}
}
'
Run Code Online (Sandbox Code Playgroud)
Awk 很容易阅读,但您应该知道它通过将每一行输入与看起来像condition { action }. 如果条件评估为真,则执行操作。所以第一个有一个条件,它是一个正则表达式,用于查找主机部分的开头,并且操作包含在花括号中。缺少第二个条件,因此假定所有行都为“真”。在处理完所有输入行后,最后一个条件匹配,并且在最后扫描的主机包括开放端口的情况下是必要的。
这种事情可以表达得更密集,但我已经写了很长时间,以便您可以更轻松地了解逻辑是如何工作的。更严格的代码会随着实践而来。
请注意,您可以将 awk 脚本放入一个单独的文件中,您可以使用 awk 的-f选项来引用该文件。阅读手册页了解详细信息。
如果您不想将 awk 部分保留在自己的文件中,也可以将整个内容放入自己的 shell 脚本中。你应该能够很容易地找到看起来像什么的例子——无论如何,这超出了这个问题的范围。