sed solução:
sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\.+) *HAS NOT BEEN PATCHED.*/ - /' reportfile
EuprecisoextrairoendereçoIPeocaminhodoarquivodeumrelatóriodoNessususandomanipuladoresdetextocomoGrep/Awk/Sed/Tretc....
EutenhooscriptparaisolaroendereçoIPeocaminhodoarquivo,masprecisolidarcomotextoaindamaiseremoveraversãoremota"não foi corrigida ..."
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"
Portanto, o resultado final deve mostrar o seguinte dos exemplos acima:
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 \ ARQUIVOS DE PROGRAMA \ MICROSOFT SQL SERVER \ MSSQL12.ACT7 \ MSSQL \ BINN \ SQLSERVR.EXE
Meu script até agora:
* se ["$ 1" == ""]; então
echo "No file specified."
echo "Usage: nesparse [filename.csv]"
else
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} '
*
A seção do código abaixo manipula o texto para os exemplos acima, com US $ 5 imprimindo o endereço IP e US $ 13 imprimindo o caminho do arquivo:
if ["$ 1" == ""]; então
echo "No file specified."
echo "Usage: nesparse [filename.csv]"
else
cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' |
grep "não foi corrigido." | sort -u *
O segundo cano do awk
awk '{match ($ 0, / ([0-9] +. [0-9] +. [0-9] +. [0-9] +). [cC]: \ (. ) tem. * / *
tem o regex correto para combinar com a saída que eu preciso (veja foto), mas estou tendo um problema com a impressão da saída regex'd
Qual é essa linha:
ip = substr $ 0, RSTART, RLENGTH); print ipadd ip} ' *
Ponto de bônus:
A regex IP corresponde a qualquer dígito, então 192.168.1.1 / 1.1.1.1, mas também corresponde aos números de versão nos exemplos acima (2014.120.5203.0), idealmente, eu preciso modificar este regex: * [0-9] +. [0-9] +. [0-9] +. [0-9] + *
para restringi-lo a 0.0.0.0 - > 255.255.255.255
sed solução:
sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\.+) *HAS NOT BEEN PATCHED.*/ - /' reportfile
sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/ - /p} ' filename
Concentre-se nas entradas que "NÃO FOI PATCHED" e, em seguida, retire as seções da string que exigimos (entre parênteses), substituindo o texto por seções on e dois (o endereço IP e o nome do arquivo)
Estou assumindo que o endereço IP sempre estará entre colchetes aqui. Se não for, você precisará combinar o padrão para o endereço IP.
$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
s/^(\[[^]]*\]).*([A-Z]:)/ - /;
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
Para cada linha que corresponda a HAS NOT BEEN PATCHED
, tire tudo entre o endereço IP e a primeira letra da unidade ( [A-Z]:
). O "Endereço IP" é definido como tudo dentro dos colchetes no início da linha que não é um colchete próximo ( [^]]*
). Em seguida, tire tudo de HAS NOT BEEN PATCHED
até o final da linha e imprima a linha modificada.
Minha recomendação seria usar um caractere de tabulação \t
como o separador de campo entre o endereço IP e o nome do caminho, em vez de -
(espaço, traço, espaço). Isso facilitaria o trabalho com mais tarde.
As regexps / HAS NOT BEEN.../
incluem um espaço no início para evitar deixar um caractere de espaço pendente na saída.
Solução 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
Correspondência de padrões contra "NÃO FOI PATCHED" e, em seguida, extrai o endereço IP e o nome do arquivo com a função de correspondência do awk. Atinge a subseção da cadeia que está relacionada ao endereço IP e ao nome do arquivo usando as variáveis RSTART e RLENGTH retornadas, juntamente com a função substr do awk. Imprima as variáveis ipadd e fle criadas.
Tags grep text-processing scripting