私はこのように見える約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