Команда unix для извлечения части имени хоста - PullRequest
19 голосов
/ 11 марта 2011

Я хотел бы извлечь первую часть этого имени хоста testsrv1 с testsrv1.main.corp.loc.domain.com в UNIX, внутри сценария оболочки.

Какую команду я могу использовать? Было бы что-нибудь до первого периода .

Ответы [ 7 ]

22 голосов
/ 11 марта 2011

У вас есть имя сервера в переменной оболочки? Вы используете sh -подобную оболочку? Если это так,

${SERVERNAME%%.*}

будет делать то, что вы хотите.

17 голосов
/ 11 марта 2011

Вы можете использовать cut:

echo "testsrv1.main.corp.loc.domain.com" | cut -d"." -f1
16 голосов
/ 26 февраля 2014

Чтобы опираться на ответ Pilcrow, нет необходимости в новой переменной, просто используйте встроенный $ HOSTANME.

echo $HOSTNAME-->my.server.domain
echo ${HOSTNAME%%.*}-->my

Протестировано на двух совершенно разных Linux.

2.6.18-371.4.1.el5, GNU bash, версия 3.2.25 (1) -релиз (i386-redhat-linux-gnu) 3.4.76-65.111.amzn1.x86_64, GNU bash, версия 4.1.2(1) -релиз (x86_64-redhat-linux-gnu)

12 голосов
/ 02 марта 2016

попробуйте ключ -s: имя хоста -s

4 голосов
/ 24 ноября 2016

Я использую команду cut, awk, sed или переменные bash

Операция

Через Cut

[flying@lempstacker ~]$ echo "testsrv1.main.corp.loc.domain.com" | cut -d. -f1
testsrv1
[flying@lempstacker ~]$

Через awk

[flying@lempstacker ~]$ echo "testsrv1.main.corp.loc.domain.com" | awk -v FS='.' '{print $1}'
testsrv1
[flying@lempstacker ~]$

Через sed

[flying@lempstacker ~]$ echo "testsrv1.main.corp.loc.domain.com" | sed -r 's@([^.]*).(.*)@\1@g'
testsrv1
[flying@lempstacker ~]$

Через Переменные Bash

[flying@lempstacker ~]$ hostName='testsrv1.main.corp.loc.domain.com'
[flying@lempstacker ~]$ echo ${hostName%%.*}
testsrv1
[flying@lempstacker ~]$
1 голос
/ 14 февраля 2019

Вы можете использовать IFS для разделения текста по любому желаемому токену. Для доменных имен мы можем использовать символ точка / точка.

#!/usr/bin/env sh

shorthost() {
  # Set IFS to dot, so that we can split $@ on dots instead of spaces.
  local IFS='.'

  # Break up arguments passed to shorthost so that each domain zone is
  # a new index in an array.
  zones=($@)

  # Echo out our first zone
  echo ${zones[0]}
}

Если это в вашем скрипте, то, например, вы получите test при запуске shorthost test.example.com. Вы можете отрегулировать это в соответствии со своим вариантом использования, но, как мне кажется, здесь важно знать, как разбить зоны на массив.

Я хотел предоставить это решение, потому что я чувствую, что порождать другой процесс - это излишне, когда вы можете сделать это легко и полностью в своей оболочке с помощью IFS. Следует обратить внимание на то, что некоторые пользователи будут рекомендовать такие вещи, как hostname -s, но это не работает в пользовательском пространстве BSD. Например, пользователи MacOS не имеют флага -s, я не думаю.

0 голосов
/ 19 апреля 2017

Вы могли бы использовать "uname -n", чтобы получить только имя хоста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...