Прочитать файл и распечатать IP-адрес в другой файл

Я закончил -следующим awkскриптом.

awk '{gsub(/ {1,5}/,"\t|")}1' infile.txt | \
awk -F'|' 'NR>1{for(i=1;i<=NF;i++) if ($i=="\t") c++;
           printf("%*s",(c*8),"\t-");
           for (fill=1;fill<=length($0)+c;fill++)printf "-";
           printf("\n%s\n",$0);c=0;next} {print $0}'

Вывод:

col1    |col2   |col3   |subcol1        |subcol2        |subcol3
                        -----------------------------------     
        |       |       |subcol4        |subcol5        |subcol6
                --------------------------------------          
        |       |col4   |subcol7        |subcol8        |subcol9
                        -------------------------------------   
        |       |       |subcol10       |subcol11       |subcol2
2
24.12.2019, 13:38
4 ответа

Еще одна петля. Этот читает список имен хостов из hostsи записывает каждое имя хоста и его ноль или более адресов IPv4 в ips. Я отделил хост от его списка IP-адресов вкладкой (\t), и каждый IP-адрес отделен от следующего пробелом :

.
#!/bin/bash
while IFS= read -r host
do
    if [[ -n "$host" ]]
    then
        ips=$(dig +short "$host" | grep '^[[:digit:].]*$' | xargs)
        printf "%s\t%s\n" "$host" "$ips"
    fi
done <hosts >ips

Пример данных:

Исходный файлhosts

bbc.co.uk
google.co.uk

Файл результатовips

bbc.co.uk       151.101.192.81 151.101.128.81 151.101.64.81 151.101.0.81
google.co.uk    216.58.213.3
0
27.01.2020, 22:16

Это берет каждую строку в файле hosts.txt, выполняет поиск DNS на хосте и записывает полученный IP-адрес (вместе с именем хоста )в ips.txt. Имейте в виду, что он не выполняет параллельный поиск для сокращения времени и не предназначен для обработки недопустимых входных данных. И он не обрабатывает несколько IP-адресов.

Что касается ошибок, если имя хоста не разрешено, на экран будет выведена ошибка. Ничего не будет записано в ips.txtдля этого хоста.

#!/bin/bash
> ips.txt
cat hosts.txt | while read host; do
    ip=$(getent hosts "$host")
    if [ $? -ne 0 ]; then
        echo "Host $host was not resolved.";
        continue
    fi
    ip=$(echo "$ip" | awk '{ print $1 }')
    echo "Host: $host, IP: $ip" >> ips.txt
done
0
27.01.2020, 22:16

Либо в одной командной строке, либо в крошечном скрипте bash:

while IFS= read -r Domainname; do [ -n "$Domainname" ] && echo "$Domainname: $(dig +short "$Domainname" | tr '\n' ' ')"; done < domainlist.csv

Это чтение файла domainlist.csv, содержащего доменные имена, в цикл while. Тело просто выводит все не -пустые строки.

0
27.01.2020, 22:16

Хорошо, что вы говорите, что digне является обязательным, потому что это не лучший инструмент для работы.

Такие инструменты, как команда host(, доступны в 3 реализациях для многих операционных систем :один из BIND от ISC, один из Knot DNS и один из djbwares )печатают информацию в человеческом -читаемую форму, и это должно быть утомительно пост -обработано, чтобы удалить мякину, если кто-то хочет простой машиночитаемый список -.

ISC digи Knot DNS kdigимеют опцию +short, которая улучшает этот (и обычные результаты dig/ kdig), но ограничена вызовом на одном доменном имени. одновременно, что требует цикла в сценарии оболочки и не менее 40 000 процессов для выполнения этой работы. (В одном из ответов здесь около 160 000 процессов.)

Другим инструментом для этого является dnsipDaniel J. Bernstein, часть его набора инструментов djbdns. То, что вы хотите сделать, это один вкладыш -через xargs, потому что инструмент может принимать несколько аргументов имени домена :

% cat domain_names.list
unix.stackexchange.com
freebsd.org
cr.yp.to
%
% xargs dnsip < domain_names.list
151.101.65.69 151.101.193.69 151.101.1.69 151.101.129.69
96.47.72.84
131.193.32.109 131.193.32.108
%
.

Это несколько уменьшает количество процессов. (Быстрый возврат -к -тесту огибающей -показывает, что уменьшение составляет 3 порядка. Мой тестовый список из 40 000 доменных имен дал всего 9 dnsipпроцессов.)

Существует dnsipqинструмент для использования не -полностью -квалифицированных доменных имен:

% cat domain_names.list
unix
freebsd
crypto
%
% xargs dnsipq < domain_names.list
unix.stackexchange.com 151.101.1.69 151.101.193.69 151.101.65.69 151.101.129.69
freebsd.stackexchange.com 151.101.65.69 151.101.193.69 151.101.1.69 151.101.129.69
crypto.stackexchange.com 151.101.1.69 151.101.129.69 151.101.193.69 151.101.65.69
%

Дополнительная литература

1
27.01.2020, 22:16

Теги

Похожие вопросы