파일에서 호스트 이름을 찾아 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를 연 결과의 두 번째 필드 값 자체 에 저장합니다.파이프에서 getline 사용하기, 다음으로 열을 인쇄한 다음 열었던 명령을 닫아야 합니다.close(cmd)여기.

또는 host다음으로 바꾸면 dig +short명령이 더 짧아집니다.

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

관련 정보