我是unix的新手。我有一个行数未知的文件,格式为:“密码,用户名”,我正在尝试创建一个函数,以根据用户输入的登录名检查此文件。
到目前为止我所拥有的:
帐户文件格式: AAA ###,名字.lastname
echo "Please enter Username:"
read username
if cut -d "," -f2 accounts | grep -w -q $username
then
echo "Success"
fi
当我只希望它返回“ firstname.lastname”时,此函数将为输入“ firstname”,“ lastname”和“ firstname.lastname”返回成功。
任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用^
和$
锚点进行精确匹配,如下所示:
echo "Please enter Username:"
read username
if cut -d "," -f2 accounts | grep -q "^$username$"; then
echo "Success"
fi
尽管即使用户输入了一个空的输入,这仍然可行,但您可能要明确检查一下。
答案 1 :(得分:2)
如果您在Shell中循环遍历文件,则可以使用字符串相等运算符代替正则表达式:
read -rp "enter Username (first.last): " username
shopt -s extglob
found=false
while IFS=, read -r pass uname _othertext; do
# from your question, it looks like the separator is "comma space"
# so we'll remove leading whitespace from the $uname
if [[ "$username" = "${uname##+([[:blank:]])}" ]]; then
echo "Success"
found=true
break
fi
done < accounts
if ! $found; then
echo "$username not found in accounts file"
fi
与while read
相比,shell中的 grep
循环非常慢,但是根据帐户文件的大小,您可能不会注意到。
答案 2 :(得分:1)
基于your comment,问题在于字段分隔符是一个逗号,然后是一个空格,而不仅仅是一个逗号。 cut
不能执行多字符定界符,但是awk
可以。在您的代码中,替换
cut -d "," -f2
使用
awk -F ", " '{print $2}'
顺便说一句,需要注意一些防止用户输入的事情:
# Use "-r" to avoid backslash escapes.
read -rp "Please enter Username:" username
# Always quote variables ("$username").
# Use "grep -F" for fixed-string mode.
# Use "--" to prevent arguments being interpreted as options.
if awk -F ", " '{print $2}' accounts | grep -wqF -- "$username"; then
echo "Success"
fi