我有一个大约有 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)
这里。
或者替换host
为dig +short
将使命令变得简短:
awk -F'[:=]' '{ cmd="dig +short "$2; cmd |getline $2;
print $1"="$2":"$3; close(cmd) }' infile