awkを使用してnslookupに必要な行を印刷します。

awkを使用してnslookupに必要な行を印刷します。

nslookupで生成された名前とIPを印刷してファイルに出力したいです。

ホストで実行すると、nslookup次の結果が表示されます。

Server: 10.10.10.10
Address: 10.10.10.10#53

Name: EXAMPLE.example.com
Address: 10.10.10.100

名前とIPをファイルの別々の列に出力したいので、現在のコマンドは次のようになります。

nslookup EXAMPLE.example.com | awk 'FNR ==4 {print$2}' | awk 'FNR ==5 {print$2}'

awkだけでは正しい値を返しても何も得られません。これがうまくいかない理由を知っていますが、これら2つの結果をその列に印刷する正しい構文を知りたいです。

答え1

nslookup EXAMPLE.example.com \
| awk '/^Name:/ {N=$2}; /^Address:/ {A=$2}; END {print N,A}'

パフォーマンスアドレスのみを印刷しますが、すべてを希望する場合:

nslookup EXAMPLE.example.com \
| awk '/^Name:/ {N=$2}; /^Address:/ {print N,$2}'

答え2

代わりに使用してくださいdig

$ dig +noall +answer example.com | awk '{ print $1, $NF }'
example.com. 93.184.216.34

$ dig +noall +answer www.google.com | awk '{ print $1, $NF }'
www.google.com. 172.217.20.36

スクリプトawkは、コマンド出力の最初と最後のスペースで区切られたフィールドを印刷しますdig(元の出力にはその間に他の列も含まれています)。


あなたの命令:

nslookup EXAMPLE.example.com | awk 'FNR ==4 {print$2}' | awk 'FNR ==5 {print$2}'

これは、2番目のプログラムが1行だけを出力する最初のawkプログラムの出力から5行目を取得しようとするため、機能しません。awk

このように動作することもできます。

$ nslookup example.com | awk 'FNR == 4 || FNR == 5 { print $2 }'
answer:
example.com

しかし、私のシステムでは、見てわかるように、必要なデータは別の行(4行と5行ではありません)にあります。これはあなたにとってより効果的かもしれません。

答え3

nslookup -type=A cdnjs.cloudflare.com | awk '/^Name:/ {c=2;N=$2} !--c {print N,$2}'

これにより、すべてのレコードが印刷されます。

cdnjs.cloudflare.com 104.16.18.94
cdnjs.cloudflare.com 104.16.19.94

他の解決策とは異なり、このスクリプトはDNSサーバーアドレスではなく実際の回答のみと一致します。失敗した場合は何も出力されません。

これはインスピレーションを受けました。この質問に対する答え

関連情報