Команды nslookup/dig/drill в файле, содержащем веб-сайты, для добавления IP-адресов

ОБНОВЛЕНИЕ. Все еще открыты решения с использованием nslookup without parallel, dig или drill.

Мне нужно написать скрипт, который сканирует файл, содержащий адреса веб-страниц в каждой строке, и добавляет к этим строкам IP-адрес, соответствующий имени, с помощью команды nslookup. На данный момент скрипт выглядит так:

#!/usr/bin/

while read ip
do

   nslookup "$ip" | 
   awk '/Name:/{val=$NF;flag=1;next} /Address:/ &&
        flag{print val,$NF;val=""}' | 
   sed -n 'p;n'

done < is8.input

Входной файл содержит следующие веб-сайты:

www.edu.ro
vega.unitbv.ro

www.wikipedia.org

Окончательный вывод должен выглядеть так:

www.edu.ro 193.169.21.181
vega.unitbv.ro 193.254.231.35

www.wikipedia.org 91.198.174.192

Основная проблема, с которой я столкнулся в текущем состоянии сценария, заключается в том, что он берет имена из nslookup (что хорошо для www.edu.ro), а не использует псевдонимы, когда они доступны. Мой вывод выглядит так:

www.edu.ro 193.169.21.181
etc.unitbv.ro 193.254.231.35

dyna.wikimedia.org 91.198.174.192

Я думал о реализации if-else для псевдонимов, но я не знаю, как это сделать в текущей команде. Также сценарий можно изменить, если кто-то лучше понимает, как отформатировать nslookup, чтобы он отображался как приведенный вывод.


person JonBjatBun    schedule 28.03.2020    source источник
comment
Кстати: Исправьте свой шебанг.   -  person Cyrus    schedule 29.03.2020


Ответы (3)


Минималистский обходной квазиответ. Вот однострочная замена скрипта с использованием GNU parallel, host (меньше работы для синтаксического анализа, чем nslookup) и sed:

parallel "host {} 2> /dev/null | 
          sed -n '/ has address /{s/.* /'{}' /p;q}'" < is8.input

...или использовать nslookup за счет дополнительной сложности GNU sed.

parallel "nslookup {} 2> /dev/null | 
          sed -n '/^A/{s/.* /'{}' /;T;p;q;}'"  < is8.input

...или используя xargs:

xargs -I '{}' sh -c \
         "nslookup {}  2> /dev/null | 
          sed -n '/^A/{s/.* /'{}' /;T;p;q;}'"  < is8.input

Вывод любого из них:

www.edu.ro 193.169.21.181
vega.unitbv.ro 193.254.231.35
www.wikipedia.org 208.80.154.224
person agc    schedule 29.03.2020
comment
Potong's sed & host one-liner — это лучшая и более простая версия вышеизложенного. - person agc; 30.03.2020
comment
Действительно хорошая команда, но можно ли ее обойти без параллели? @agc - person JonBjatBun; 01.04.2020

Замените полную строку nslookup на:

echo "$IP $(dig +short "$IP" | grep -m 1 -E '^[0-9.]{7,15}$')"
person Cyrus    schedule 28.03.2020

Это может сработать для вас (GNU sed и host):

sed '/\S/{s#.*#host & | sed -n "/ has address/{s///p;q}"#e}' file

Для всех непустых строк: вызовите команду host для предоставленного имени хоста и передайте результаты другому вызову sed, который удаляет текст и завершает работу после первого результата.

person potong    schedule 29.03.2020
comment
Это лучше. Не думал использовать eval вместо parallel. - person agc; 29.03.2020
comment
@agc Я полностью за использование параллелизма GNU, но в этом случае кажется, что ОП хочет сохранить пустые строки, и sed лучше подходит в этих обстоятельствах. - person potong; 30.03.2020