¿Cómo puedo eliminar el nombre del apellido cuando se desconoce la longitud?

¿Cómo puedo eliminar el nombre del apellido cuando se desconoce la longitud?

Estoy intentando escribir un script bash simple en el que el usuario ingresa su nombre de usuario y luego se le saluda, según la hora del día, con su apellido. Actualmente tengo lo siguiente:

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étera etcétera.

Logré cortar las 3 comas del final del nombre que están allí, pero quiero poder cortar el primer nombre.

Por ejemplo:

  • El $namees Amber Martin,,,.
  • He reducido a Amber Martin.
  • Necesito reducir más para Martin.
  • Y esto debe funcionar con cualquier nombre.

Respuesta1

Es mejor usarlo getent passwdque leer /etc/passwddirectamente. getentTambién funciona con LDAP, NIS y demás. Creo que existe en la mayoría de los Unix. (Mi OS X no lo tiene, pero tampoco tiene mi cuenta /etc/passwd, así que...)

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

El procesamiento de cadenas se puede realizar con el shellexpansión de parámetros, estos son compatibles con 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"

Utilice ${name#* }para eliminar hasta el primer espacio. (Solo espero que nadie tenga un apellido de dos partes, con espacios entre ellas).

También podría cutreemplazarse con división de palabras o read, estableciendo IFSdos puntos.

Respuesta2

#!/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"

Respuesta3

Una vez que tengas elCampo GECOS (comentario), simplemente puedes realizar otro cutpara eliminar los campos de ubicación y número de teléfono (vacíos en tu caso), esta vez con ,como separador:

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

Lo dejo como ejercicio para afrontartodas las diferentes posibilidadesde lo que es un "apellido"!

información relacionada