Localiza e substitui o nome do host para o endereço IP dentro de um arquivo

3

Eu tenho um arquivo enorme com cerca de 12300 linhas que parecem algo semelhante a isso.

001.domain.com=001.somedomain.com:10001
002.domain.com=002.somedomain.com:10002
003.domain.com=003.somedomain.com:10003

Eu quero que o arquivo seja assim quando estiver pronto

001.domain.com=IP_Address_of_001.somedomain.com:10001
002.domain.com=IP_Address_of_002.somedomain.com:10002
003.domain.com=IP_Address_of_003.somedomain.com:10003

Então, basicamente, eu preciso encontrar e substituir o nome do host após os sinais = com o endereço IP.

Se alguém puder me apontar na direção certa, eu agradeceria.

    
por needtoknow 16.01.2017 / 21:13

3 respostas

7

Isso usa sed para extrair o nome do host e, em seguida, usa o dig para obter seu IP e, em seguida, usa o sed novamente para a substituição. Ele envia as substituições para um novo arquivo:

$ while read line; do 
    hostname=$(echo "$line" | sed "s/.*=\(.*\):.*//g")
    ip=$(dig +short $hostname | head -n1)
    echo "$line" | sed "s/\(.*=\).*\(:.*\)/${ip}/g"
done < file.txt > new_file.txt
    
por 16.01.2017 / 21:56
0

Uma opção semelhante usando host em vez de dig :

$ cat filename.txt | while read line; do 
IP=$(host $(echo $line | cut -d'=' -f1) | grep -m1 "has address" | rev | cut -d' ' -f1 | rev)
echo $line | sed "s/\(.*=\).*\(:.*\)/${IP}/g"
done

A análise que leva o nome do host pode ser substituída por awk :

$ cat filename.txt | while read line; do 
IP=$(host $(echo $line | cut -d= -f1) | awk -F'[ ]' '/has address/ {print $4;exit;}')
echo $line | sed "s/\(.*=\).*\(:.*\)/${IP}/g"
done
    
por 17.01.2017 / 11:13
0

com awk :

awk -F'[:=]' '{ cmd="host "$2"| cut -d\" \" -f4"; cmd |getline $2; 
    print $1"="$2":"$3; close(cmd) }' infile

Definimos um comando shell host $2"| cut -d\" \" -f4 para uma variável chamada cmd . Então com cmd |getline $2 o awk execute o comando salva o resultado no segundo valor do próprio campo a partir do resultado de cmd que abrimos Usando getline de um Pipe , em seguida, imprimimos as colunas, então precisamos fechar o comando que abrimos e usamos close(cmd) aqui.

Ou substitua host por dig +short para tornar o comando curto:

awk -F'[:=]' '{ cmd="dig +short "$2; cmd |getline $2; 
    print $1"="$2":"$3; close(cmd) }' infile
    
por 12.05.2018 / 14:25