「回答」を示すファイルのnslookup awk

「回答」を示すファイルのnslookup awk

私は現在、複数のホストでnslookupを使用してから、awkを使用して目的の行をテーブルに印刷するスクリプトを実行しています。 1行はfile1に印刷し、もう1行は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

関連情報