У меня есть файл с именем, hostlist.txt
который содержит такой текст:
host1.mydomain.com
host2.mydomain.com
anotherhost
www.mydomain.com
login.mydomain.com
somehost
host3.mydomain.com
У меня есть следующий маленький скрипт:
#!/usr/local/bin/bash
while read host; do
dig +search @ns1.mydomain.com $host ALL \
| sed -n '/;; ANSWER SECTION:/{n;p;}';
done <hostlist.txt \
| gawk '{print $1","$NF}' >fqdn-ip.csv
Какие выходы для fqdn-ip.csv
:
host1.mydomain.com.,10.0.0.1
host2.mydomain.com.,10.0.0.2
anotherhost.internal.mydomain.com.,10.0.0.11
www.mydomain.com.,10.0.0.10
login.mydomain.com.,10.0.0.12
somehost.internal.mydomain.com.,10.0.0.13
host3.mydomain.com.,10.0.0.3
У меня вопрос: как удалить .
запятую перед запуском без вызова sed
или gawk
снова? Есть ли какой-то шаг, который я могу выполнить в существующих sed
или gawk
вызовах, которые уберут точку?
hostlist.txt
будет содержать тысячи хостов, поэтому я хочу, чтобы мой скрипт был быстрым и эффективным.
dig +short
вас не работает?Ответы:
Команда
sed
,awk
команда и удаление завершающего периода могут быть объединены в одну команду awk:Или, как разбито на несколько строк:
Поскольку
awk
команда следует заdone
оператором,awk
вызывается только один процесс. Хотя эффективность здесь не имеет значения, это более эффективно, чем создание нового процесса sed или awk с каждым циклом.пример
С этим тестовым файлом:
Команда выдает:
Как это устроено
awk неявно читает свои входные данные по одной записи (строке) за раз. Этот скрипт awk использует одну переменную,
f
которая указывает, была ли предыдущая строка заголовком раздела ответа или нет.f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Если предыдущая строка была заголовком раздела ответа, тогда
f
будет true и команды в фигурных скобках будут выполнены. Первый удаляет завершающий период из первого поля. Второе печатает первое поле, затем,
следует последнее поле. Третье утверждение сбрасываетсяf
в ноль (ложь).Другими словами,
f
здесь функционирует как логическое условие. Команды в фигурных скобках выполняются, если неf
равен нулю (что в awk означает «true»)./ANSWER SECTION/{f=1}
Если текущая строка содержит строку
ANSWER SECTION
, то переменнаяf
устанавливается в1
(true).Здесь
/ANSWER SECTION/
служит логическим условием. Значение true, если текущий соответствует регулярному выражениюANSWER SECTION
. Если это так, то команда в фигурных скобках выполняется.источник
f
ли произвольная переменная илиf{}
явной частью функциональности awk?f
это произвольная переменная. Вы действительно можете поставить перед{}
сложными логическими условиями.f
это просто очень простое логическое условие: оно истинно, если не равно нулю, ложно, если равно нулю./ANSWER SECTION/
играет роль логического условия, аналогичного ролиf
в первой команде. Я обновил ответ, чтобы обсудить это.dig
может читать в файле, содержащем список имен хостов, и обрабатывать их одно за другим. Вы также можете сказать,dig
чтобы подавить все выходные данные, кроме раздела ответа.Это должно дать вам вывод, который вы хотите:
awk
«Ssub()
функция используется для полосы буквального периода.
от конца первого поля. Затемawk
печатает поля 1 и 5 через запятую.ПРИМЕЧАНИЕ: записи,
hostlist.txt
которые не разрешены, полностью удаляются - они не отображаются в stdout ИЛИ stderr.(Проверено на Linux и FreeBSD)
источник
Измените ваш вызов
gawk
на следующее:источник