Как удалить символ точки из строки без вызова 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 
  • Как получить исходный вывод showkey для использования в скрипте?
  • 7z не исключает каталоги из файла исключений
  • Извлеките и форматируйте данные с помощью `cut` и` awk`
  • Добавить имя файла в качестве первой строки файла в сценарии оболочки
  • попытка избежать цитат
  • Удалить все файлы в каталоге
  • Чтобы посчитать количество совпадений в мега-строке быстро
  • Любой способ, с помощью которого я могу преобразовать любую заданную временную метку в стандартную в BASH
  • Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?
  • Используя инструмент командной строки cURL на Mac, как можно получить данные запаса, которые возвращаются * без * запятых?
  • Bash: запустить команду2, если команда1 не выполнена
  • Interesting Posts

    Как применить исправление уязвимости bash для CVE-2014-6271 на cygwin?

    Что означают три значения для инструментов сетевого мониторинга

    Жесткая привязка файлов других пользователей

    Принимая пароль из файла, когда SSH входит в машину

    Есть ли способ указать имя файла «/etc/apt/sources.list»?

    log rotate, почему создание нового журнала называется журналом rotate вместо log delete или log refresh

    Можно ли сделать файл .tar.gz непосредственно из stdin? Или, мне нужно, чтобы смонтировать вместе уже gzipped файлы

    Определите, был ли файл изменен

    Можно ли сосредоточиться на одном ядре на вычислениях в реальном времени при использовании других в качестве обычных ядер?

    пакет с IP-адреса поступает на определенный порт => open portrange to IP для x секунд

    Неправильное количество свободного места на диске, которое видно после использования Gparted

    Как остановить ssh-сервер на arch linux

    Bash: собрать две серии файлов

    configure allowed_tcp_congestion_control через конфигурационные файлы в ядре linux

    cssh: изменить терминал с xterm на терминатор

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