在文件中查找主机名并将其替换为 IP 地址

在文件中查找主机名并将其替换为 IP 地址

我有一个大约有 12300 行的巨大文件,看起来与此类似。

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

我希望文件完成后看起来像这样

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

所以基本上我需要查找 = 符号后的主机名并将其替换为 ip 地址。

如果有人能指出我正确的方向,我将不胜感激。

答案1

这使用 sed 提取主机名,然后使用 dig 获取其 IP,然后再次使用 sed 进行替换。它将替换输出到新文件:

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

答案2

host使用代替的类似选项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/\(.*=\).*\(:.*\)/\1${IP}\2/g"
done

采用主机名的解析可以替换为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/\(.*=\).*\(:.*\)/\1${IP}\2/g"
done

答案3

awk

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

我们将 shell 命令设置host $2"| cut -d\" \" -f4为名为 的变量cmd。然后cmd |getline $2执行awk命令将结果保存到cmd我们打开它的结果中的第二个字段值本身从管道使用 getline,接下来我们打印列,然后我们需要关闭我们打开的命令,我们使用close(cmd)这里。

或者替换hostdig +short将使命令变得简短:

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

相关内容