![Использование Awk для печати нужных строк nslookup](https://rvso.com/image/134421/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20Awk%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D0%BD%D1%83%D0%B6%D0%BD%D1%8B%D1%85%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%20nslookup.png)
Я хочу вывести имя и IP-адрес, полученные в результате nslookup, чтобы можно было вывести их в файл.
Когда я запускаю 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}'
Это не работает, поскольку вторая awk
программа пытается получить пятую строку из вывода первой 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-сервера. Он ничего не выведет в случае неудачи.
Это было вдохновленоответ на этот вопрос.