Primeiramente, eu gostaria de encorajá-lo a examinar a saída XML do Nmap (disponível com o -oX
flag), que é o formato de saída legível por máquina oficialmente suportado. A saída Greppable ( -oG
ou .gnmap
) está obsoleta e, portanto, não inclui informações úteis de recursos mais novos do Nmap, como scripts traceroute e NSE.
Para responder às suas perguntas diretamente,
-
o problema de corresponder uma vírgula ou um espaço está causando erros porque o caractere de barra de alternância (
|
) deve ter o escape, não a vírgula. Além disso, você provavelmente sempre deseja corresponder a um caractere de espaço em branco, mas apenas às vezes a vírgula. É assim que eu faria isso:,\?\s
Eu não estou usando o agrupamento, já que não há alternação ("ou" pipe).
-
sed
não está imprimindo "linhas" que você não quer, está imprimindo o espaço do padrão. A página de informações do sed explica como o sed funciona e é uma ótima referência para escrever scripts sed. Você essencialmente tem 2 espaços para trabalhar, e sed imprimirá todo o conteúdo do espaço de padrão quando você usar o comandop
.
Como um exemplo de como você pode fazer isso, aqui está minha opinião sobre um script sed para imprimir apenas as informações da porta de um arquivo .gnmap
:
#!/usr/bin/sed -n
#First, strip the beginning (Host and Ports labels) off
s/.*Ports: //
#Now match a port entry, consuming the optional comma and whitespace
#The comma and whitespace are replaced with a newline
s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\n_
#If we made a successful substitution, jump to :matched,
t matched
#otherwise skip to the next input line
d
:matched
#Print the pattern space up to the first newline
P
#Then delete up to the first newline and start over with what's left
D
Todos juntos em uma linha, seriam parecidos com isto:
sed -n -e 's/.*Ports: //;s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\n_;t matched;d;:matched;P;D' file.gnmap
Note também que você não pode contar com alguns dos campos na especificação da porta para estar sempre vazio. Se a detecção de versão foi feita em um serviço RPC, por exemplo, o campo de informações do SunRPC será preenchido.