我需要使用文本处理程序(例如 Grep / Awk / Sed / Tr 等)从 Nessus 报告中提取 IP 地址和文件路径......
我已经有了隔离 IP 地址和文件路径的脚本,但我需要进一步处理文本并删除“尚未修补远程版本......”
192.168.1.1 - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED. REMOTE VERSION : 6.2.9200.16384 SHOULD BE : 6.2.9200.16859"
192.168.1.2 THE REMOTE HOST IS MISSING ONE OF THE FOLLOWING ROLLUP KBS : - 4022719 - 4022722C:\WINDOWS\SYSTEM32\BCRYPT.DLL HAS NOT BEEN PATCHED. REMOTE VERSION : 6.1.7601.23796 SHOULD BE : 6.1.7601.23816"
192.168.1.3 - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED. REMOTE VERSION : 6.2.9200.16384 SHOULD BE : 6.2.9200.16859"
192.168.1.4 - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE HAS NOT BEEN PATCHED. REMOTE VERSION : 2014.120.5000.0 SHOULD BE : 2014.120.5203.0"
因此,最终结果应输出上述示例中的以下内容:
192.168.1.1\WINDOWS\SYSTEM32\GPPREF.DLL
192.168.1.2\WINDOWS\SYSTEM32\BCRYPT.DLL
192.168.1.3\WINDOWS\SYSTEM32\GPPREF.DLL
192.168.1.4 \程序文件\微软 SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE
到目前为止我的脚本:
!/bin/bash
*如果[“$1”==“”];然后
echo "No file specified."
echo "Usage: nesparse [filename.csv]"
别的
cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | grep "has not been patched." | sort -u | awk '{ match($0,/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*[cC]:\\(.*) has.*/; ip=substr $0,RSTART,RLENGTH);print ipadd ip} '
*
下面的代码部分处理上面示例的文本,其中 $5 打印 IP 地址,$13 打印文件路径:
!/bin/bash
* if [ "$1" == "" ];然后
echo "No file specified."
echo "Usage: nesparse [filename.csv]"
别的
cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' |
grep“尚未修补。” |排序 -u *
第二个 awk 管道
* awk '{ 匹配($0,/([0-9]+.[0-9]+.[0-9]+.[0-9]+).[抄送]:\(.) 有。*/ *
有正确的正则表达式来匹配我需要的输出(参见图片),但我在打印正则表达式的输出时遇到问题
这是哪一行:
* ip=substr $0,RSTART,RLENGTH);print ipadd ip} ' *
奖励积分:
IP 正则表达式匹配任何数字,因此 192.168.1.1 / 1.1.1.1 但它也与上面示例中的版本号(2014.120.5203.0)匹配,理想情况下我需要修改此正则表达式:* [0-9]+.[0- 9]+.[0-9]+.[0-9]+ *
将其限制为 0.0.0.0 --> 255.255.255.255
答案1
sed解决方案:
sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\\.+) *HAS NOT BEEN PATCHED.*/\1 - \3/' reportfile
答案2
$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
s/^(\[[^]]*\]).*([A-Z]:)/\1 - \2/;
s/ HAS NOT BEEN PATCHED.*//p}' nessus.log
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\WINDOWS\SYSTEM32\BCRYPT.DLL
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE
对于匹配的每一行HAS NOT BEEN PATCHED
,删除 IP 地址和第一个驱动器号 ( [A-Z]:
) 之间的所有内容。 “IP 地址”定义为行开头方括号内的所有内容(不是右方括号 ( [^]]*
))。然后删除从HAS NOT BEEN PATCHED
该行到末尾的所有内容,并打印修改后的行。
我的建议是使用制表符\t
作为 IP 地址和路径名之间的字段分隔符,而不是-
(空格、破折号、空格)。这将使以后的工作更加容易。
正则表达式/ HAS NOT BEEN.../
在开头包含一个空格,以避免在输出中留下悬空空格字符。
答案3
sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/\1 - \2/p} ' filename
重点关注“未修补”的条目,然后拉出我们需要的字符串部分(括号中),用文本替换 和 两个部分(IP 地址和文件名)
我假设 IP 地址始终位于方括号中。如果不是,那么您需要对 IP 地址进行模式匹配。
答案4
awk解决方案:
awk '/HAS NOT BEEN PATCHED/ { match($0,/\[.*\]/);ipadd=substr($0,RSTART,RLENGTH);match($0,/C.* HAS/);fle=substr($0,RSTART,RLENGTH-4);print ipadd" - "fle }' filename
与“HAS NOT BEEN PATCHED”进行模式匹配,然后使用 awk 的 match 函数提取 IP 地址和文件名。使用返回的 RSTART 和 RLENGTH 变量以及 awk 的 substr 函数获取与 ip 地址和文件名相关的字符串的子部分。打印创建的 ipadd 和 fle 变量。