Как удалить символ точки из строки без вызова sed или awk снова?

У меня есть файл 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 будет содержать 1000 хостов, поэтому я хочу, чтобы мой скрипт был быстрым и эффективным.

3 Solutions collect form web for “Как удалить символ точки из строки без вызова sed или awk снова?”

Команда sed команда awk и удаление конечного периода могут быть объединены в одну команду awk:

 while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}' 

Или, как разброс по нескольким линиям:

 while read -r host do dig +search "$host" ALL done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}' 

Поскольку команда awk следует за заявлением done , вызывается только один awk процесс. Хотя эффективность здесь не имеет значения, это более эффективно, чем создание нового sed или awk-процесса с каждым циклом.

пример

С этим тестовым файлом:

 $ cat hostlist.txt www.google.com fd-fp3.wg1.b.yahoo.com 

Команда производит:

 $ while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}' www.google.com, 216.58.193.196 fd-fp3.wg1.b.yahoo.com, 206.190.36.45 

Как это работает

awk неявно считывает свой вход по одной записи (строке) за раз. Этот awk-скрипт использует одну переменную f , которая сигнализирует, была ли предыдущая строка заголовком секции ответа или нет.

  • f{sub(/.$/,"",$1); print $1", "$NF; f=0}

    Если предыдущая строка была заголовком раздела ответа, то f будет истинным, а команды в фигурных скобках будут выполнены. Первый удаляет конечный период из первого поля. Второй печатает первое поле, за которым следует, за которым следует последнее поле. Третий оператор сбрасывает f до нуля (false).

    Другими словами, f здесь функционирует как логическое условие. Команды в фигурных скобках выполняются, если f отличен от нуля (что в awk означает «true»).

  • /ANSWER SECTION/{f=1}

    Если текущая строка содержит строку ANSWER SECTION , то переменная f устанавливается в 1 (true).

    Здесь /ANSWER SECTION/ служит логическим условием. Он оценивает значение true, если текущий соответствует регулярному выражению ANSWER SECTION . Если это так, то команда в фигурных скобках выполняется.

dig может читать в файле, содержащем список имен хостов, и обрабатывать их один за другим. Вы также можете сообщить dig для подавления всех выходных данных, кроме раздела ответа.

Это должно дать вам требуемый результат:

 dig -f hostlist.txt +noall +answer +search | awk '{sub(/\.$/,"",$1); print $1","$5}' 

Функция sub() awk используется для полосового литерального периода . от конца первого поля. Затем awk печатает поля 1 и 5, разделенные запятой.

ПРИМЕЧАНИЕ. Записи в hostlist.txt которые не разрешены, полностью отбрасываются – они не отображаются на stdout OR stderr.

(Проверено на Linux и FreeBSD)

Измените ваш вызов gawk следующим образом:

 | gawk '{print substr($1,1,length($1)-1)","$NF}' >fqdn-ip.csv 
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Найти набор дополнений массива?
  • Каков наиболее эффективный способ проверить, установлен ли узел в настоящее время?
  • Что происходит, когда скрипт встречает ошибку в одной из команд?
  • Перечислите directoties на один уровень, за исключением некоторых названных каталогов и файлов
  • эхо-имена и количество строк для каждого файла в каталоге
  • Как прочитать вывод команд в скрипте
  • В bash я должен спросить каждую строку из первого файла csv, второго файла csv и ответов, помещенных в третий файл csv
  • Bash для вызова PHP, дождитесь завершения процесса PHP?
  • Сортировка файла на основе средней части
  • Тысяча разделителей в awk
  • Interesting Posts

    Вывод из цикла while с корпусом переключателя внутри

    Использование опции -n с pushd и popd

    В чем разница между обычным пользователем и системным пользователем?

    Замена белых пробелов / символов на обратную косую черту

    Перенос синтаксиса даты Linux на FreeBSD

    FreeNAS против обычного (CentOS / Ubuntu) Linux-сервера?

    `chmod 770 folderName` ограничивает доступ к подкаталогам и подфайлам?

    Использование переменных оболочки для параметров команды

    Как перенести аргументы командной строки с помощью emacs keybindings?

    /usr/lib/libgraph.so.1 не является символической ссылкой

    Разбить колонку в нескольких столбцах в соответствии с определенной строкой

    Bash надежный способ тестирования файла существует

    Будет ли изменение имени хоста в OpenBSD повлиять на установленные пакеты?

    Список правил iptables как команда добавления

    Каков рекомендуемый способ запуска службы в качестве пользователя без полномочий root?

    Linux и Unix - лучшая ОС в мире.