Я пытаюсь извлечь имя хоста из следующей строки (созданной с использованием 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
Это где awk
лучший инструмент. awk -F"[()]" '{print $2}'
следует вытащить то, что указано в скобках. Ничего не печатает, если его нет. Так...
$ who am i | awk -F"[()]" '{print $2}'
www.example.com
- Кристофер Карел
Ты можешь использовать who am i | grep -o -e "\((.*)\)"
в обеих системах, и он просто возвращает пустую строку, если вы вошли в систему локально.
Вот sed
версия, которая работает с круглыми скобками или без скобок вокруг имени хоста или пробелов в дате:
who am i | sed 's/.* (\?\([^)]*\))\?$/\1/'
Если вам нравится резать (и я не говорю, что нет более элегантных способов сделать это, но вы выбрали инструмент, и мне тоже нравится резать), попробуйте
who am i | cut -f2 -d\( | tr -d ')'
Вы берете второе поле, используя левую скобку в качестве разделителя (которая будет включать закрывающую скобку, но не открывающую), а затем используйте tr, чтобы удалить закрывающую скобку.
Я не уверен насчет случая, когда строка отсутствует, поскольку каждый раз, когда я пробую ее на локально зарегистрированном компьютере, я получаю что-то вернулся в скобки. Не могли бы вы привести пример того, что вы получаете в этих обстоятельствах?