![Awk を使用して nslookup の必要な行を印刷する](https://rvso.com/image/134421/Awk%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20nslookup%20%E3%81%AE%E5%BF%85%E8%A6%81%E3%81%AA%E8%A1%8C%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B.png)
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 がそれぞれ正しい値を返すにもかかわらず、何も得られません。なぜこれが機能しないのかはわかっていますが、これらの結果の両方をそれぞれの列に出力するための正しい構文が知りたいのです。
答え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 サーバーのアドレスは照合しません。失敗した場合は何も出力されません。
これは、この質問に対する答え。