Вырезать значение поля awk

У меня есть этот «раздел ответов» из звонка dig:

www.google.com 300 IN A \<ip_address\>

Я хочу извлечь поддомен www из www.google.com, чтобы сохранить его в переменной.

Я попытался использовать sed, чтобы отфильтровать имя поддомена, а затем заменить первое поле (т. е. $1) после перехода к awk на $host_name, например:

host_name=$(echo get_dig "$@" | sed 's/..*//; s/ .*//')
...
get_dig "$@" | awk '{ $1 = $host_name; printf("The subdomain %s is a %s record and points to %s\\n", $1, $4, $5) }'

NB: get_dig — это функция оболочки, которую я создал для запуска dig и извлечения «раздела ответов».

Я протестировал, и часть sed обрезается, как я ожидаю, и дает правильный результат (т. имя хоста в строке www. Кроме того, я объявил $1 глобально.

PS: я должен использовать awk, но возможно, что я мог заглянуть в конкретный процесс с помощью $host_name

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам никогда не понадобится sed, если вы используете awk. Я думаю, это то, что вы пытаетесь сделать, используя любой awk:

echo 'www.google.com 300 IN A \<ip_address\>' |
awk '{
    sub(/\..*/,"",$1);
    printf "The subdomain %s is a %s record and points to %s\n", $1, $4, $5
}'
The subdomain www is a A record and points to \<ip_address\>

Замените echo '...' на get_dig "$@" (которого у меня явно нет).

Что касается того, почему ваш скрипт не работал, см. Как использовать переменные оболочки в скрипте awk? и избавьтесь от echo перед get_dig в трубе к sed.

Ваш ответ отлично сработал и дал желаемый результат. Это избавило меня от необходимости использовать sed и отслеживать другую переменную, так что спасибо за это! Из-за этого я много читал awk, но почему-то не наткнулся на эту sub функцию. Есть ли awk документация, на которую вы могли бы мне направить, чтобы я мог больше узнать о сабвуфере и других awk функциях.

Koyejo 13.07.2023 13:46

Получите книгу «Эффективное программирование AWK, 5-е издание» Арнольда Роббинса, но sub() описан на каждой справочной странице awk, например. man7.org/linux/man-pages/man1/awk.1p.html , поэтому я не уверен, в какой документации вы просматривали ее, но избавьтесь от этой документации. Это также описано в спецификации POSIX awk, pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html.

Ed Morton 13.07.2023 14:20

после покупки книги вы также можете использовать соответствующий справочный материал по адресу gnu.org/software/gawk/manual/gawk.html#String-Functions.

Ed Morton 13.07.2023 14:22
awk '{ $1 = $host_name; printf("The subdomain %s is a %s record and points to %s\\n", $1, $4, $5) }'

Вы пытаетесь получить доступ к host_name-му полю строки, если вы хотите использовать переменную оболочки внутри команды awk, вы должны вставить ее, используя один из

-v var=val
--assign var=val 

Рассмотрим следующий простой пример

host_name = "www"
echo "uno dos tres" | awk -v host_name = "$host_name" '{$1=host_name; printf("Subdomain %s is %s and points to %s\n",$1,$2,$3)}'

дает вывод

Subdomain www is dos and points to tres

Примечание. Я использую echo "uno dos tres" вместо вашей команды.

(проверено в GNU Awk 5.1.0)

@EdMorton Я улучшил свой ответ

Daweo 12.07.2023 18:57

если вы просто хотите извлечь поля из ответа dig, вот быстрый способ разделить его. Форматирование тривиально с этого момента:

dig +noall +answer www.google.com | 
                                    gtee >( gcat -n >&2; ) | 

     1  www.google.com.     112 IN  A   142.250.80.36

mawk NF=NF FS='[.][^ \t]+[ \t]+|[ \t].+[ \t]' OFS='\f'

www
   112
      142.250.80.36

Другие вопросы по теме