Como extrair hostname de $ (quem sou eu)

3

Eu tento extrair o nome do host da seguinte string (criada usando who am i ):

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

Eu preciso de uma solução que também funcione se (www.example.com) não estiver presente, o que é o caso quando estou logado localmente. Além disso, a solução também precisa funcionar em um Mac em que who am i retorna a seguinte string:

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

O problema é que o mac coloca espaços na data que dificultam o uso de cut . Acho que deve haver uma solução usando sed para extrair a substring, mas tenho problemas para descobrir como usar sed apropriadamente.

Atualização: abordagem de Mad

Essa abordagem só funciona bem se houver parênteses presentes. Caso contrário, acontece o seguinte:

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

4 respostas

15

Aqui é onde awk é a melhor ferramenta. awk -F"[()]" '{print $2}' deve extrair o que está entre parênteses. Não imprime nada se não estiver lá. Então ...

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


- Christopher Karel

    
por 05.10.2010 / 17:15
5

Você pode usar who am i | grep -o -e "\((.*)\)" em ambos os sistemas, e ele simplesmente retorna uma string vazia se você estiver logado localmente.

    
por 05.10.2010 / 17:17
2

Se você gosta de corte (e eu não estou dizendo que não há maneiras mais elegantes de fazer isso, mas você escolheu a ferramenta, e eu também gosto de cortar, também), tente

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

Você pega o segundo campo, usando o parêntese esquerdo como o separador (que incluirá o parêntese de fechamento, mas não o parêntese de abertura), e então usar tr para deletar o parêntese fechado.

Não tenho certeza sobre o caso em que a string não está presente, já que todas as vezes que eu tento em uma máquina conectada localmente recebo algo retornado nos colchetes. Você poderia dar um exemplo do que você tem nessas circunstâncias?

    
por 05.10.2010 / 17:01
2

Aqui está uma versão sed que funciona com ou sem parênteses em torno do nome do host ou espaços na data:

who am i | sed 's/.* (\?\([^)]*\))\?$//'
    
por 05.10.2010 / 19:14