использование 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 из переменной?

  • Форматирование в формате Printf с переменным форматом - что делает эта ссылка?
  • Возможно ли создать среду Linux без традиционной командной оболочки?
  • как makefile может определить, доступна ли команда на локальном компьютере?
  • Разделение переменной bash
  • CasperJS и PHP In Cron Job не могут открывать файлы, отлично работают при запуске Manualy
  • как сравнить два xml-файла с одинаковыми данными в разных строках?
  • В форме `exec FD>` exec
  • Правильно проанализировать аргументы в скрипте, которые ведут себя как оболочка, вызываемая через SSH
  • 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 - лучшая ОС в мире.