grep nmap 输出,有条件地打印选定的行
grep nmap output, conditionally print selected lines
我正在尝试编写一个 bash 脚本,它将读取 .txt 文件中的一系列 ip 地址,并使用 NSE (smb-os-discovery
对每个 ip 执行 nmap 扫描) 脚本。从这个输出中,我只想打印某些行,但前提是其中一行与特定模式匹配。
我已经尝试了多种不同的选项,但无法让它按我想要的方式工作,因为我要检查和输出的两个项目位于不同的两行中。
我设法获得的最接近的是编写以下 bash 脚本:
#!/bin/bash
for server in $(cat servers-smb.txt); do
nmap --script smb-os-discovery $server | grep "report\|OS: Windows"
done
当 运行 上面的脚本输出有服务器 运行 Windows 但也有 report
那些没有的行,这是预期的,因为grep 表达式包含一个 'OR' 运算符。
如有任何帮助,我们将不胜感激。
grep
不容易适应你想要的东西,但 Awk 是天作之合。
#!/bin/sh
while read server; do
nmap --script smb-os-discovery "$server" |
awk '/report/ { r=[=10=] } /OS: Windows/ { print r; print; exit }'
done <servers-smb.txt
Awk 脚本收集报告行,然后将其与 OS: 行一起打印(如果它匹配 "OS: Windows".
)
另请注意更改后的 shebang(此脚本中没有任何 Bash 特定内容,因此最好 运行 将其与普通 sh
一起使用),[=16 的偏好=] 在 for
+ Useless cat
上,在循环内正确引用 "$server"
,最后在控制块内使用适当的缩进以提高易读性。
一种不太吸引人的方法是将两个 grep
串起来。我在这里提到它是为了完整性——任何超过一个 grep
的东西最好作为 Awk 或 sed
脚本来完成。
grep "report\|OS: Windows" | grep -B1 "OS: Windows"
最后,使用 grep
实现相同结果的一种简单方法是将 IP 地址添加到输出中,因为您已经在 server
变量中拥有它。
while read server; do
nmap --script smb-os-discovery "$server" |
# XXX: suboptimal; see below
grep "OS: Windows" | sed "s/^/$server:/"
done <servers-smb.txt
当然,grep | sed
也是一种反模式,最好只表示为 sed
脚本:
while read server; do
nmap --script smb-os-discovery "$server" |
sed -n "/OS: Windows/s/^/$server:/p"
done <servers-smb.txt
这具有在一条线上收集一台主机的输出的额外好处,这使其更适合使用典型的 Unix 面向行的工具进行额外处理。
我正在尝试编写一个 bash 脚本,它将读取 .txt 文件中的一系列 ip 地址,并使用 NSE (smb-os-discovery
对每个 ip 执行 nmap 扫描) 脚本。从这个输出中,我只想打印某些行,但前提是其中一行与特定模式匹配。
我已经尝试了多种不同的选项,但无法让它按我想要的方式工作,因为我要检查和输出的两个项目位于不同的两行中。 我设法获得的最接近的是编写以下 bash 脚本:
#!/bin/bash
for server in $(cat servers-smb.txt); do
nmap --script smb-os-discovery $server | grep "report\|OS: Windows"
done
当 运行 上面的脚本输出有服务器 运行 Windows 但也有 report
那些没有的行,这是预期的,因为grep 表达式包含一个 'OR' 运算符。
如有任何帮助,我们将不胜感激。
grep
不容易适应你想要的东西,但 Awk 是天作之合。
#!/bin/sh
while read server; do
nmap --script smb-os-discovery "$server" |
awk '/report/ { r=[=10=] } /OS: Windows/ { print r; print; exit }'
done <servers-smb.txt
Awk 脚本收集报告行,然后将其与 OS: 行一起打印(如果它匹配 "OS: Windows".
)另请注意更改后的 shebang(此脚本中没有任何 Bash 特定内容,因此最好 运行 将其与普通 sh
一起使用),[=16 的偏好=] 在 for
+ Useless cat
上,在循环内正确引用 "$server"
,最后在控制块内使用适当的缩进以提高易读性。
一种不太吸引人的方法是将两个 grep
串起来。我在这里提到它是为了完整性——任何超过一个 grep
的东西最好作为 Awk 或 sed
脚本来完成。
grep "report\|OS: Windows" | grep -B1 "OS: Windows"
最后,使用 grep
实现相同结果的一种简单方法是将 IP 地址添加到输出中,因为您已经在 server
变量中拥有它。
while read server; do
nmap --script smb-os-discovery "$server" |
# XXX: suboptimal; see below
grep "OS: Windows" | sed "s/^/$server:/"
done <servers-smb.txt
当然,grep | sed
也是一种反模式,最好只表示为 sed
脚本:
while read server; do
nmap --script smb-os-discovery "$server" |
sed -n "/OS: Windows/s/^/$server:/p"
done <servers-smb.txt
这具有在一条线上收集一台主机的输出的额外好处,这使其更适合使用典型的 Unix 面向行的工具进行额外处理。