Используйте grep
, если совпадение означает, что оно действительно:
grep -P '^[0-9]+(\.[0-9]+)?$' infile.txt
Приведенное выше регулярное выражение можно использовать в sed
или awk
или любой другой команде.
sed -n -Ee '/^[0-9]+(\.[0-9]+)?$/p'
awk '/^[0-9]+(\.[0-9]+)?$/'
Здесь также проверяется, соответствует ли файл этому регулярному выражению или нет.
awk '/^[0-9]+(\.[0-9]+)?$/{print "matched";exit} {print "not-matched";exit}' file
TL;DR:правил нет; вместо этого это зависит от реализации, выполненной разработчиком приложения.
ДЛИННАЯ ВЕРСИЯ:
Когда программа использует PAM для аутентификации, она должна вызыватьpam_start()
:
int pam_start(const char *service_name, const char *user, const struct pam_conv *pam_conversation, pam_handle_t **pamh);
Первый аргумент, service_name
, используется для выбора конфигурации.
Например, сервер OpenSSH вызывает pam_start()
в исходном файлеauth_pam.c
:
sshpam_err =
pam_start(SSHD_PAM_SERVICE, user, &store_conv, &sshpam_handle);
Константа SSH_PAM_SERVICE
определяется (в том же файле )следующим образом:
#if !defined(SSHD_PAM_SERVICE)
extern char *__progname;
# define SSHD_PAM_SERVICE __progname
#endif
Кроме того, значение __progname
определено в ssh.c
как:
__progname = ssh_get_progname(av[0]);
Как вы, возможно, знаете, av[0]
в C — это имя двоичного файла. Таким образом, если двоичный файл демона OpenSSH называется sshd
, pam_start()
будет вызываться с sshd
в качестве service_name
.
(Обратите внимание, что я проигнорировал вызов ssh_get_progname()
, но я думаю, что этого достаточно, чтобы проиллюстрировать мой ответ.)