en lugar de echo usa printf, este no agrega "\n" por defecto
tenga en cuenta que printf es un comando de bash, así que asegúrese de que su shell lo admita
getent passwd | awk -F : 'length($1) >= 5 && length($1) <= 10 { print $1 }'
Будут напечатаны имена пользователей длиной от 5 до 10 символов (включительно ).
Для самых коротких и самых длинных имен:
getent passwd |
awk -F : 's == "" || length($1) < length(s) { s = $1 }
l == "" || length($1) > length(l) { l = $1 }
END { printf("shortest: %s (%d chars)\n", s, length(s))
printf("longest: %s (%d chars)\n", l, length(l)) }'
Выполнение обеих операций за один проход по базе данных паролей (в виде полного bash
скрипта, хотя /bin/sh
этого должно было быть более чем достаточно, поскольку этот скрипт не использует bash
ничего конкретного, любая оболочка сможет его запустить):
#!/bin/bash
getent passwd |
awk -F : 'length($1) >= 5 && length($1) <= 10 { print $1 }
s == "" || length($1) < length(s) { s = $1 }
l == "" || length($1) > length(l) { l = $1 }
END { printf("shortest: %s (%d chars)\n", s, length(s))
printf("longest: %s (%d chars)\n", l, length(l)) }'
Вот ваше домашнее задание:
#!/bin/bash
for NAME in $(cut -d: -f1 < /etc/passwd)
do
if [[ ${#NAME} -gt 10 || ${#NAME} -lt 5 ]]
then
continue
else
echo "Username in the system is: $NAME"
echo "Its length Is ${#NAME}"
fi
done
Пожалуйста.
Непрактичный, но несколько завораживающий :bash расширенные шаблоны файлов:
shopt -s extglob
getent passwd |
cut -d: -f1 |
while IFS= read -r name; do
[[ $name == ?????@(|?|??|???|????|?????) ]] && echo "$name"
done
Для большего разнообразия cut
иgrep
:
getent passwd | cut -d: -f1 | grep -Ex '.{5,10}'
Это извлекает записи пароля, вырезает первое поле (имя пользователя ), затем запрашивает у grep совпадение расширенного регулярного выражения, которое охватывает всю строку (-x
), где есть от 5 до 10 любых символов (.
).