我尝试从下面的string中提取主机名(使用who am i创build的):
username pts/0 2010-10-05 17:30 (www.example.com)
我需要一个解决scheme,如果(www.example.com)不存在,也是我在本地login的情况下也可以工作。 此外,解决scheme还必须在Mac上工作who am i返回以下string:
username ttys006 Oct 5 16:47 (www.example.com)
问题是mac在date中放置空格,这使得难以使用cut 。 我认为,必须有一个解决scheme使用sed来提取子string,但我有问题搞清楚如何适当使用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 "\((.*)\)" who am i | grep -o -e "\((.*)\)" ,如果你在本地login,它只是返回一个空string。
这是一个sed版本,可以在date的主机名或空间周围使用括号或不使用括号。
who am i | sed 's/.* (\?\([^)]*\))\?$/\1/'
如果你喜欢剪辑(我不是说没有更好的方法去做,但是你select了这个工具,而且我更喜欢剪辑),试试
who am i | cut -f2 -d\( | tr -d ')'
你用第二个字段作为分隔符(其中包括closures的paren,尽pipe不是开放的),然后用tr删除closures的paren。
我不确定string不存在的情况,因为我在本地login的机器上尝试它的时候,我会得到括号中返回的内容。 你能否举一个你在这种情况下得到的例子吗?