Я закончил -следующим 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
Еще одна петля. Этот читает список имен хостов из 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
Это берет каждую строку в файле 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
Либо в одной командной строке, либо в крошечном скрипте bash:
while IFS= read -r Domainname; do [ -n "$Domainname" ] && echo "$Domainname: $(dig +short "$Domainname" | tr '\n' ' ')"; done < domainlist.csv
Это чтение файла domainlist.csv
, содержащего доменные имена, в цикл while
. Тело просто выводит все не -пустые строки.
Хорошо, что вы говорите, что dig
не является обязательным, потому что это не лучший инструмент для работы.
Такие инструменты, как команда host
(, доступны в 3 реализациях для многих операционных систем :один из BIND от ISC, один из Knot DNS и один из djbwares )печатают информацию в человеческом -читаемую форму, и это должно быть утомительно пост -обработано, чтобы удалить мякину, если кто-то хочет простой машиночитаемый список -.
ISC dig
и Knot DNS kdig
имеют опцию +short
, которая улучшает этот (и обычные результаты dig
/ kdig
), но ограничена вызовом на одном доменном имени. одновременно, что требует цикла в сценарии оболочки и не менее 40 000 процессов для выполнения этой работы. (В одном из ответов здесь около 160 000 процессов.)
Другим инструментом для этого является dnsip
Daniel 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 %
dnsip
. djbwares . dnsipq
. djbwares .