"답변"을 표시하는 파일에 대한 nslookup awk

"답변"을 표시하는 파일에 대한 nslookup awk

저는 현재 여러 호스트에서 nslookup을 사용한 다음 awk를 사용하여 원하는 행을 테이블에 인쇄하는 스크립트를 실행 중입니다. 한 줄은 file1에, 다른 줄은 file2에 인쇄한 다음 paste file1 file2 >> file3이 테이블을 생성하는 데 사용합니다.

테이블은 이렇게 생겼어요

Host   IP
name  10.10.10.10
name  10.10.10.10
name 10.10.10.10

대부분의 경우 이것이 효과가 있습니다. 그러나 어떤 이유에서인지 160개의 결과 중 약 20개는 왼쪽 열에 "답변:"이 표시되고 호스트 이름은 오른쪽에 표시됩니다. 이와 같이:

Host IP
answer:  hostname

이는 결과 전반에 걸쳐 무작위로 표시되며 스크립트가 실수로 작동하지 않도록 nslookup에 "답변:"이라는 단어가 어디에도 없기 때문에 이를 알아낼 수 없습니다.

참조용 스크립트는 다음과 같습니다.

hosts='hosts.list'
filelines=`cat $hosts`

Empty_Containers(){
        truncate -s 0 tmp.txt
        truncate -s 0 file1
        truncate -s 0 file2
}

for h in $filelines ;
do
        Empty_Containers
        nslookup $h > tmp.txt
        if grep -q "NXDOMAIN" tmp.txt
        then
                cat tmp.txt | awk 'FNR ==4 {print$5}' > file1
                echo "Did_Not_Resolve" > file2
                paste file1 file2 >> i.txt
        else
                cat tmp.txt | awk 'FNR ==4 {print$2}' > file1
                cat tmp.txt |awk 'FNR ==5 {print$2}' > file2
                paste file1 file2 >> i.txt
        fi
        cat i.txt | column -t 2 i.txt
done

답변1

원하는 목표가 호스트 이름과 IP 주소 테이블을 만드는 것 뿐이고 사용에 특별히 신경 쓰지 않는 경우 nslookup빠른 루프를 사용하여 겉으로는 원하는 출력을 생성할 수 있었습니다 for .. echo.

for h in $( cat hosts.list ); do
    a=$(dig +short $h | head -n1)
    echo -e "$h\t${a:-Did_Not_Resolve}"
done

dig는 에 비해 약간 더 친숙한 스크립팅 DNS 도구입니다. nslookup+short옵션을 사용하면 출력이 더욱 깔끔해집니다. 레코드가 없는 요청의 출력은 빈 문자열이므로 내장된 bash기본 매개변수 확장( ${var:-default})을 사용하여 "기본" 응답을 제공하는 레코드가 없는 경우를 처리합니다 Did_Not_Resolve.

$ dig www.example.com

; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com.       IN  A

;; ANSWER SECTION:
www.example.com.    20308   IN  A   93.184.216.34

;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE  rcvd: 60

$ dig +short www.example.com
93.184.216.34

최종 산출량은 다음과 같습니다.

www.example.com 93.184.216.34
www.google.com  172.217.14.68
host.doesnotexist.tld   Did_Not_Resolve
unix.stackexchange.com  151.101.129.69

대안은 다음 dig과 같습니다 host.

$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69

아래 댓글의 질문에 대한 답변:

내가 사용하는 유일한 옵션 dig+short출력을 지정된 호스트의 IP 주소로 줄이거나 그렇지 않으면 빈 문자열로 줄이는 것입니다. 출력을 캡처하고 이를 변수 ("주소"용) 에 할당하기 때문에 dig서브셸( )에서 실행합니다 . 일부 호스트(예: 호스트가 여러 IP 주소를 반환하는 경우)를 통해 출력을 파이핑하고 있습니다. 단순화를 위해 첫 번째 주소를 가져옵니다. $( dig [...] )adighead -n1unix.stackexchange.com

이것이 변수로 추출되는 이유는 앞서 설명한 대로 간단한 매개변수 확장 트릭을 사용하여 빈 문자열 대신 "해결되지 않음" 텍스트를 제공할 수 있도록 하기 위함입니다.

구체적으로 성명서 에서 요청한 대로 확장합니다 echo.

echo -e "$h\t${a:-Did_Not_Resolve}"
  • 스위치 는 내가 사용할 것이라고 -e알려줍니다 .echo이자형풍경 시퀀스. 이 경우에는 \t와 결합하면 문자 그대로 이스케이프 -e되는 것이 Tab아니라 가 되는 것을 사용하고 있습니다 t.
  • $h는 예상한 대로 단순히 변수의 내용으로 대체됩니다 h.
  • \t는 앞서 설명한 대로 탭이 됩니다.
  • ${a:-Did_Not_Resolve}. 아, 바로 여기에 마법이 있습니다. bash매개변수 확장을 수행할 때 프로세스의 일부로 약간의 자기 성찰을 수행할 수 있는 기능이 있습니다. 구문은 ${var:-default}변수의 내용으로 확장됩니다.var 또는, 설정되지 않았거나 null인 경우 제공된 대체 항목입니다(이 예의 경우 default; 또는 실제 사용 사례에서는 Did_Not_Resolve). 이에 대한 자세한 내용은 bash매뉴얼 페이지의 "매개변수 확장" 섹션에서 확인할 수 있습니다 .

최종 결과는 각 줄에 다음 순서로 호스트 이름, a Tab및 주소(있는 경우), Did_Not_Resolve없는 경우 텍스트가 출력됩니다.

관련 정보