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

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

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

  • Извлечь точное количество элементов из одного и того же идентификатора
  • почему этот простой скрипт sed не работал »nginx -V 2> & 1 | sed -r 's / - / \\ n / g' "
  • Дублируйте выбранные слова с помощью sed и замените их
  • awk - упростить этот скрипт
  • разбиение файла на номер столбца
  • awk - получить вход как от файла, так и от STDIN?
  •  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 из переменной?

  • Отображение переменной даты
  • сохранить дубликаты из $ PATH на источнике
  • Заменить столбец в одном файле столбцом из другого с помощью awk?
  • Почему значение $ 1 изменилось в `{$ total = $ total + $ 1}`?
  • Это хорошая идея для фильтрации ввода перед запуском awk-действия?
  • Почему корневой вывод bash окрашен, но `sudo ls` нет?
  • 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 - лучшая ОС в мире.