Devolver linha conditonally na próxima linha

1

Estou tentando retornar uma lista de endereços IP para computadores que possuem um sistema operacional Windows (para meu curso de segurança). A saída está neste formato

Nmap scan report for 192.168.xx.xxx
Host is up (0.066s latency).
PORT    STATE SERVICE
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address:

Host script results:
| smb-os-discovery: 
|   OS: Windows Server (R) 2008 Standard 6001 Service Pack 1 (Windows Server (R) 2008 Standard 6.0)
|   OS CPE: cpe:/o:microsoft:windows_server_2008::sp1
|   Computer name: 
|   NetBIOS computer name: 
|   Workgroup: WORKGROUP
|_  System time: 2015-12-22T17:01:33-08:00

Consegui colocar os valores em um formato melhor usando grep "for\|Windows"

Nmap scan report for 192.168.xx.xx1
|   OS: Windows XP (Windows 2000 LAN Manager)
Nmap scan report for 192.168.xx.xx5
|   OS: Windows 2000 (Windows 2000 LAN Manager)
Nmap scan report for 192.168.xx.xx8
Nmap scan report for 192.168.xx.x15

Agora estou tentando obter o valor (grep) da linha anterior, se a próxima linha contiver um "|" personagem, mas não tenho ideia de como. Eu tentei usar tr "|" "\b" , mas isso não funcionou

Entrada (armazenada em um arquivo de texto)

Line 1
|   Line2
Line 3
|   Line 4
Line 5
|   Line 6
Line 7
Line 8
Line 9
|   Line 10
Line 11

Saída desejada

Line 1
Line 3
Line 5
Line 9
    
por Eitan K 31.12.2015 / 00:24

2 respostas

2

Você poderia fazer sem grep , por exemplo, com sed você poderia salvar a linha com o IP para armazenar o buffer e copiá-lo no espaço padrão apenas quando o sistema operacional for Windows (excluindo todas as outras linhas):

... | sed '/^Nmap scan report for/h;/^|[[:blank:]]*OS: Windows/!d;g'

ou, de maneira semelhante, com awk , desta vez imprimindo apenas o IP em vez da linha inteira:

... | awk '/^Nmap scan report for/{t=$5};/^\|[[:blank:]]*OS: Windows/{print t}'
    
por 31.12.2015 / 01:16
1
sed -e'$!N;/\n|/P;D' \
<<""
Line 1
|   Line2
Line 3
|   Line 4
Line 5
|   Line 6
Line 7
Line 8
Line 9
|   Line 10
Line 11
Line 1
Line 3
Line 5
Line 9

Se ficar mais profundo ...

sed -e'/^ *|/!{$!N;/\n|/P;}' -eD \
<<""
Line 1
|   Line2
|   Line 3
|___|   Line 4
    |   Line 5
    |___Line 6
Line 7
Line 8
Line 9
|   Line 10
Line 11
Line 1
Line 9

Você pode descartar grep w / ...

sed -ne'/^Nmap.* /!{/^|.*: Win.*(W/!d;}' \
    -e's///;/)/H;x;s/\n/: (W/p' \
<<""
Nmap scan report for 192.168.xx.xxx
Host is ...
bla... and more ...
and bla and so on...
#
Host script results:
| smb-os-discovery:
|   OS: not windows Server (R) ... !(Windows Server (R) 2008 Standard 6.0)
|   OS CPE: cpe:/o:microsoft:windows_server_2008::sp1
|   Comp ... some words ...
|   Net... more words ...
|   Work... words again ...
|_  Sys...
#
Nmap scan report for 192.168.xx.xxx
Host is ...
MAC Address:
#
Host script results:
| smb-os-discovery:
|   OS: Windows Server (R) 2008 Standard 6001 Service Pack 1 (Windows Server (R) 2008 Standard 6.0)
|_  System time: 2015-12-22T17:01:33-08:00
192.168.xx.xxx: (Windows Server (R) 2008 Standard 6.0)
    
por 31.12.2015 / 00:46