Как извлечь имя хоста из $(кто я)
Я пытаюсь извлечь имя хоста из следующей строки (созданной с помощью 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/'