나는 이와 비슷하게 보이는 약 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