我尝试从以下字符串(使用创建who am i
)中提取主机名:
username pts/0 2010-10-05 17:30 (www.example.com)
我需要一个解决方案,即使 (www.example.com) 不存在(我在本地登录时就是这种情况),该解决方案也必须适用于who am i
返回以下字符串的 Mac:
username ttys006 Oct 5 16:47 (www.example.com)
问题是 mac 在日期中加入了空格,这使其难以使用cut
。我认为,一定有一个用于sed
提取子字符串的解决方案,但我无法弄清楚如何sed
正确使用。
更新:Mad 的方法
这种方法只有在括号确实存在的情况下才有效。如果没有,则会发生以下情况:
$ who am i | cut -f2 -d '(' | tr -d ')'
username ttys006 Oct 5 16:47
答案1
这是awk
最好的工具。 awk -F"[()]" '{print $2}'
应该取出括号中的内容。如果括号中的内容不存在,则不打印任何内容。所以...
$ who am i | awk -F"[()]" '{print $2}'
www.example.com
——克里斯托弗·卡雷尔
答案2
您可以在两个系统上使用who am i | grep -o -e "\((.*)\)"
,如果您在本地登录,它只会返回一个空字符串。
答案3
如果你喜欢剪切(我并不是说没有更优雅的方法,而是你选择了工具,我也很喜欢剪切),尝试
who am i | cut -f2 -d\( | tr -d ')'
您取第二个字段,使用左括号作为分隔符(其中包括右括号,但不包括左括号),然后使用 tr 删除右括号。
我不确定字符串不存在的情况,因为我每次在本地登录的机器上尝试时都会得到某物返回括号中的值。您能举例说明在这种情况下会得到什么吗?
答案4
这是一个sed
可以在主机名周围使用或不使用括号或者在日期中使用空格的版本:
who am i | sed 's/.* (\?\([^)]*\))\?$/\1/'