私は現在、複数のホストで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 [...] )
a
dig
head -n1
unix.stackexchange.com
これを変数に引き出す理由は、この記事の前半で説明したように、単純なパラメータ拡張トリックを使用して空の文字列の代わりに「未分析」テキストを提供できるためです。
明細書の要件に従って具体的に拡張しますecho
。
echo -e "$h\t${a:-Did_Not_Resolve}"
- スイッチで使用するように
-e
求められます。echo
金利風景の順序。この場合には、 と組み合わせると文字通りの escape の代わりに a となるものを\t
使用しています。-e
Tabt
$h
予想通り変数の内容に置き換えてくださいh
。\t
前述のようにタブになります。${a:-Did_Not_Resolve}
。あ、ここは魔法の場所だ。bash
プロセスの一部としてパラメータ拡張を実行するときは、いくつかの自己分析を実行できます。構文は${var:-default}
変数の内容に展開されます。var
または、設定されていない、またはnullの場合に提供された代替項目です(この例では、default
またはここの実際のユースケースではDid_Not_Resolve
)。bash
これについての詳細は、マニュアルページの「パラメータ拡張」セクションで確認できます。
最終結果は、各行に次の順序でホスト名、a Tab、アドレス(存在する場合)またはテキスト(存在しない場合)の出力です。Did_Not_Resolve