Вопрос или проблема
Я хочу извлечь имя хоста (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)}'
Как это работает:
-F'[.-"]'
: Указывает, что разделителями являются символы точки, дефис и кавычка. Это даст нам возможность разделить строку таким образом, чтобы последние части, содержащие хост (например,rd5044
), оказались в отдельных полях./host=/
: Фильтр, который ищет строки, содержащиеhost=
.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 — выбор остается за вами, в зависимости от ваших предпочтений и навыков. Эти инструменты предоставляют достаточную гибкость для работы с текстом в командной строке, и каждый из них имеет свои преимущества. Выберите тот метод, который лучше соответствует вашим потребностям и окружению.