ファイル内のホスト名を見つけて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

シェルコマンドをhost $2"| cut -d\" \" -f4名前付き変数に設定しましたcmd。次に、コマンドをcmd |getline $2実行して、awk結果cmdを開いた結果の2番目のフィールド値自体に保存します。パイプでgetlineを使用する、次に列を印刷し、開いたコマンドを閉じる必要があります。close(cmd)ここで。

または、host次に置き換えると、dig +shortコマンドが短くなります。

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

関連情報