использование sed / awk в переменных сценария bash

Прошло много времени с тех пор, как мне пришлось использовать sed или awk, так что медведь со мной. Я пытаюсь получить имя DNS-сервера 4.2.2.1 .

Использование host 4.2.2.1 Я получаю этот вывод:

 1.2.2.4.in-addr.arpa domain name pointer a.resolvers.level3.net 

в моем сценарии я делаю это как:

 name="$($host $server)" 

Как я могу использовать sed / awk в $name только для получения a.resolvers.level3.net , имея в виду, что я буду использовать это на совершенно разных серверах, поэтому я не могу просто grep a.resolvers из переменной?

  • Не удается открыть терминал из-за настроек
  • Что такое отображение эха $ -1?
  • cron: синтаксис bash не работает
  • Рекурсивно удалять файлы с именем «WIDTHxLENGTH» в имени в каталоге
  • Что задает переменную окружения $ SHELL?
  • Идентификатор процесса печати (PID) экземпляра Matlab
  • Баш ограничен оболочкой с использованием rbash
  • Что означает «FILENAME = $ (echo $ INFILE | grep -oE» + $ ")" означает?
  • 5 Solutions collect form web for “использование sed / awk в переменных сценария bash”

    Другой вариант – отрезать строку:

     echo ${name##* } 

    Это отрежет строку и сохранит часть, начиная с последнего места до конца.

     ${name <-- from name ## <-- trim the front * <-- matches anything ' ' <-- until the last ' ' } 

    Проще всего было бы использовать awk и сообщить ему, чтобы напечатать последнее поле:

     $ echo "$name" | awk '{print $NF}' a.resolvers.level3.net 

    Конечно, если все, что вам нужно, это IP-адрес сервера, вы можете также получить это name в первую очередь, поэтому вам не нужно его обрабатывать позже:

     name=$(host $server | awk '{print $NF}') 
     name=$(host "$server" | grep -o '[^[:space:]]*$') 

    выберет конечную часть вывода команды хоста.

    Просто sed альтернативу sed . Это будет печатать последний столбец из строки, разделенной пробелами.

      sed 's/.*[[:space:]]\(.*\)$/\1/' 

    Я тестировал его для случаев, когда a.resolvers.level3.net – единственная строка в переменной $ name, и она работает.

     $ echo "$name" 1.2.2.4.in-addr.arpa domain name pointer a.resolvers.level3.net $ $ echo "$name"|sed 's/.*[[:space:]]\(.*\)$/\1/' a.resolvers.level3.net $ $ name="a.resolvers.level3.net" $ echo "$name"|sed 's/.*[[:space:]]\(.*\)$/\1/' a.resolvers.level3.net $ 

    Более короткий ответ, не связанный с строковой манипуляцией,

     dig +short -x 4.2.2.1 

    который отображает

     a.resolvers.level3.net. 

    и больше ничего. Конечно, вы должны установить коп.

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