фильтрация вывода команд с помощью awk

Вопрос или проблема

Я хочу извлечь имя хоста (rd5044) из вывода команды psql, как показано ниже:

postgres@internal-rd5112:/opt/db/postgres/bin> psql -p 5434 -tc "SHOW primary_conninfo ;"
 user=replicator passfile="/home/postgres/.pgpass" channel_binding=prefer host="internal-rd5044.efa-bauen.portal.cn-mv.de" port=5434 sslmode=prefer sslcompression=0 sslsni=1 ssl_min
_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any

так что есть пустая строка и много текста вокруг моей цели rd5044.
Я бы начал с | awk "NR==1", но не знаю, как продолжить с этого момента.

Кто-то предложил | awk -F'[\'-]' '/host=/{print $(NF-1)}', но это не работает (как будто не хватает кавычки или что-то в этом роде).

Может кто-нибудь помочь мне с этим?

С помощью awk, близко к тому, что вы пытались добиться:

... | awk -F '[.-]' '/ host=/{print $(NF-7)}'

Если часть host="internal надежна:

С помощью GNU grep:

... | grep -oP "host="internal-\K[^\.]+"

С помощью Perl:

... | perl -lne 'print $& if /host=\047internal-\K[^\.]+/'

Дает:

rd5044

Ответ или решение

Для фильтрации вывода команды psql, чтобы извлечь хостнейм (например, rd5044) из строки, содержащей информацию о подключении, можно использовать инструмент awk, который является мощным инструментом для обработки текстов в Unix-подобных системах.

Решение с использованием awk

Чтобы достичь вашей цели с помощью awk, мы начнем с фильтрации строки, которая содержит интересующий нас host. Мы можем использовать разделитель с помощью флага -F, чтобы разделить строку на поля и затем выбрать нужное поле.

Пример команды:

psql -p 5434 -tc "SHOW primary_conninfo ;" | awk -F'[.-"]' '/host=/{print $(NF-1)}'

Как это работает:

  1. -F'[.-"]': Указывает, что разделителями являются символы точки, дефис и кавычка. Это даст нам возможность разделить строку таким образом, чтобы последние части, содержащие хост (например, rd5044), оказались в отдельных полях.
  2. /host=/: Фильтр, который ищет строки, содержащие host=.
  3. print $(NF-1): Выводит предпоследнее поле. Здесь NF — это общее количество полей в строке, поэтому $(NF-1) будет равно полю, содержащему нужное значение хоста.

Альтернативные подходы

Использование grep

Если вы хотите использовать grep, вы можете сделать это следующим образом:

psql -p 5434 -tc "SHOW primary_conninfo ;" | grep -oP 'host="internal-\K[^"]+'

Здесь:

  • grep -oP включает поддержку Perl-совместимого регулярного выражения.
  • host="internal-\K[^"]+ ищет строку, начиная с host="internal-, и возвращает текст после этого, который не включает кавычку, тем самым извлекая только хостнейм.

Использование Perl

В качестве альтернативы можно также использовать Perl для достижения той же цели:

psql -p 5434 -tc "SHOW primary_conninfo ;" | perl -lne 'print $1 if /host="internal-(.+?)"/'

Заключение

Каждый из представленных методов дает вам возможность быстро и эффективно извлечь хостнейм rd5044 из вывода команды psql. Использование awk, grep или Perl — выбор остается за вами, в зависимости от ваших предпочтений и навыков. Эти инструменты предоставляют достаточную гибкость для работы с текстом в командной строке, и каждый из них имеет свои преимущества. Выберите тот метод, который лучше соответствует вашим потребностям и окружению.

Оцените материал
Добавить комментарий

Капча загружается...