"답변"을 보여주는 파일에 대한 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

아래 댓글의 질문에 답해 보세요.

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

이를 변수로 끌어내는 이유는 이 문서의 앞부분에서 설명한 대로 간단한 매개변수 확장 트릭을 사용하여 빈 문자열 대신 "분석되지 않은" 텍스트를 제공할 수 있기 때문입니다.

명세서의 요구 사항에 따라 구체적으로 확장합니다 echo.

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

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

관련 정보