Como posso remover o primeiro nome do sobrenome quando o comprimento é desconhecido?

4

Estou tentando escrever um script bash simples no qual o usuário insere seu nome de usuário e, em seguida, ele é saudado, dependendo da hora do dia pelo sobrenome. Atualmente tenho o seguinte:

echo Please enter your username
read username
name=$(grep $username /etc/passwd | cut -d ':' -f 5)

h='date +%H'

if [ $h -lt 12]; then
  echo Good morning ${name::-3)

etc.

Eu consegui cortar as 3 vírgulas no final do nome que está lá, mas eu quero ser capaz de cortar o primeiro nome.

Por exemplo:

  • O $name é Amber Martin,,, .
  • reduzi para Amber Martin .
  • Preciso reduzir ainda mais para Martin .
  • E isso precisa funcionar com qualquer nome.
por Amber Martin 27.04.2017 / 13:32

3 respostas

10

Melhor usar getent passwd do que ler /etc/passwd diretamente. getent também funciona com LDAP, NIS e outros. Eu acho que existe na maioria dos Unixes. (Meu OS X não tem isso, mas ele não tem minha conta em /etc/passwd , então ...)

name=$(getent -- passwd "$USER" | cut -d: -f5)

O processamento de strings pode ser feito com a expansão de parâmetros do shell , estes são compatíveis com POSIX:

name=${name%%,*}         # remove anything after the first comma
name=${name%,,,}         # or remove just a literal trailing ",,,"
name=${name##* }         # remove from start until the last space
echo "hello $name"

Use ${name#* } para remover até o primeiro espaço. (Só espero que ninguém tenha um sobrenome de duas partes, com espaço intermediário).

O cut também pode ser substituído por divisão de palavras ou read , definindo IFS como dois-pontos.

    
por 27.04.2017 / 14:03
5
#!/bin/bash
#And also /bin/sh looks like to be compatible in debian.  
echo "Hmmm... Your username looks like to be $USER"
name="$(getent passwd $USER | cut -d: -f5 | cut -d, -f1)"
echo "Your full name is $name"
surname="$(echo $name | rev | cut -d' ' -f1 | rev)"
echo "Your surname is $surname"
echo "thank your for using only cut and rev to do that..."
echo "But i am sure there is a better way"
    
por 27.04.2017 / 13:49
4

Depois de ter o campo GECOS (comentário) , você pode simplesmente executar outro cut para remover o (vazio) no seu caso) campos de localização e número de telefone, desta vez com , como o separador:

name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"

Vou deixar como um exercício para lidar com todos os diferentes possibilidades do que é um "sobrenome"!

    
por 27.04.2017 / 15:51