如果语句匹配的单词用特殊字符分隔

时间:2018-08-21 20:15:43

标签: bash unix

我是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”返回成功。

任何帮助将不胜感激。

3 个答案:

答案 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