!/bin/bash

!/bin/bash

正则表达式

我需要使用文本处理程序(例如 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 变量。

相关内容