Как извлечь имя хоста из $(кто я)

Я пытаюсь извлечь имя хоста из следующей строки (созданной с помощью who am i):

username pts/0        2010-10-05 17:30 (www.example.com)

Мне нужно решение, которое также работает, если (www.example.com) нет, что происходит, когда я вошел в систему локально. Кроме того, решение также должно работать на Mac, где who am i возвращает следующую строку:

username ttys006      Oct  5 16:47 (www.example.com)

Проблема в том, что Mac ставит пробел в дате, что затрудняет использование cut, Я думаю, должно быть решение с использованием sed извлечь подстроку, но у меня проблемы с выяснением, как использовать sed соответственно.

Обновление: подход Мэда

Этот подход хорошо работает, только если на самом деле присутствуют скобки. Если нет, происходит следующее:

$ who am i | cut -f2 -d '(' | tr -d ')'
username ttys006      Oct  5 16:47

4 ответа

Решение

Это где awk это лучший инструмент. awk -F"[()]" '{print $2}' должен вытащить то, что в скобках. Ничего не печатает, если его там нет. Так...

$ who am i | awk -F"[()]" '{print $2}'
www.example.com


- Кристофер Карел

Ты можешь использовать who am i | grep -o -e "\((.*)\)" в обеих системах, и он просто возвращает пустую строку, если вы вошли в систему локально.

Если вам нравится резать (и я не говорю, что нет более изящных способов сделать это, но вы выбрали инструмент, а мне тоже нравится резать), попробуйте

who am i | cut -f2 -d\( | tr -d ')'

Вы берете второе поле, используя левую пареню в качестве разделителя (которая будет включать закрывающую пареню, но не открывающую), а затем используйте tr для удаления закрытой парен.

Я не уверен насчет случая, когда строка отсутствует, так как все время, когда я пробую ее на локальном компьютере, я получаю что-то возвращаемое в скобках. Не могли бы вы привести пример того, что вы получаете при таких обстоятельствах?

Вот sed версия, которая работает с или без скобок вокруг имени хоста или пробелов в дате:

who am i | sed 's/.* (\?\([^)]*\))\?$/\1/'
Другие вопросы по тегам