Armazena múltiplos grep em uma saída de comando para uma variável

1

Estou tentando obter uma lista de IPs com UP, então usei nmap para salvar todos eles em um arquivo de texto:

nmap -v -sn 10.10.10.1-254 -oG hosts.txt 

Agora, quero executar outro comando nmap nesses IPs, para analisar e obter o IP do arquivo de texto. Eu estou tentando o seguinte, mas não está funcionando; a variável v não tem o valor de IP salvo:

#!/bin/bash
while read line; do    
    v=$line|grep 'Up' -B1|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

    echo $v
done < hosts.txt
    
por Ricky mem 11.05.2018 / 18:55

1 resposta

1

Seu script não parece estar escrito corretamente:

v=$line | grep [...]

Atribuir uma variável não tem saída, então você não está colocando nada em grep .

Provavelmente seria mais simples apontar awk no seu arquivo hosts.txt :

$ nmap -v -sn 10.10.10.1/24 -oG hosts.txt > /dev/null 2>&1
$ awk '$NF=="Up" { print $2 }' hosts.txt    

Dado o formato do arquivo criado por nmap (perdoe o intervalo de IPs diferentes; estou claramente em uma rede diferente, mas o exemplo ainda é válido):

$ head hosts.txt
# Nmap 7.60 scan initiated Fri May 11 10:14:28 2018 as: nmap -v -sn -oG hosts.txt 172.28.9.67/24
# Ports scanned: TCP(0;) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 172.28.9.0 (hostname1.internal)   Status: Up
Host: 172.28.9.1 (hostname2.internal)   Status: Up

Se estivermos interessados apenas em hosts que mostram Status: Up , a palavra mágica é a última da linha. Portanto, usamos awk para ver apenas as linhas em que o último campo é igual a Up e imprimir o segundo campo (a saber: o endereço IP).

    
por 11.05.2018 / 19:15