Как я могу удалить имя из фамилии, если длина неизвестна?

Здесь пояснения от разработчиков ядра.

5
27.04.2017, 20:05
3 ответа

Лучше использовать getent passwd, чем напрямую читать /etc/passwd. getent также работает с LDAP, NIS и т.п. Я думаю, что он существует в большинстве Unix. (В моей OS X его нет, но и моей учетной записи в /etc/passwd тоже нет, так что...)

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

Обработка строк может быть выполнена с помощью оболочки расширение параметров, они совместимы с 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"

Используйте ${name#* } для удаления до первого пробела. (Просто надеюсь, что ни у кого нет двухчастной фамилии с пробелом между ними).

cut также можно заменить на разделение слов или read, установив IFS в двоеточие.

11
27.01.2020, 20:31
#!/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"
5
27.01.2020, 20:31

Когда у вас есть GECOS (комментарий )поле , вы можете просто выполнить еще одно cut, чтобы удалить (пустые в вашем случае )поля местоположения и номера телефона, на этот раз с ,в качестве разделителя:

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

Я оставлю в качестве упражнения рассмотрение всех различных возможностей того, что такое "фамилия"!

4
27.01.2020, 20:31

Теги

Похожие вопросы