尝试执行脚本来搜索文件中的用户输入

Trying to do script to search user input in a file

我正在尝试学习 Bash 脚本编写,并做一些练习。

现在正在尝试创建脚本来搜索名称并从文件中获取记录。 文件内容是这样的:Name:Phone:Email 示例:John Doe:123456789:jd@gmail.com 但是我创建了一个函数

names=$(awk '{print }' $HOME/name_list.txt)

name_list()
{
for i in $names; do
    if [ "$i" == "$name" ];then  #name is user input from scriptfile.
        echo $names | grep -o $i | wc -l | tr "\n" " ";echo "person found" 
    else
        echo "Couldn't find anyone with given name"
    fi
done
}

令我困扰的是,我的 if 条件为文件中的每个 'i' 生成“找到人员”输出。同样,else 条件为每个不匹配的 'i' 生成输出。我能理解为什么它会这样工作,但我找不到其他方法来做到这一点。我希望我的脚本扫描所有文件并只为总匹配生成 1 个输出,如果没有匹配则只生成 1 个输出。

假设 name_list.txt 是 as-advertised(只是一个名称列表),那么您应该能够从文件中读取 grep 的搜索字符串...

echo $names | grep --file=$HOME/name_list.txt # ...

我应该提到 grep 还提供了 -c--count,它们计算匹配项。使用现代风格的 grep,您还想了解 -w--word-regexp,如果它们不代表完整的单词(或集合),它们将拒绝匹配目标模式单词),这样“约翰”就不会匹配“约翰逊”。

这将需要重新组织您的脚本,因为 grep 完成了大部分工作,并且可能会违反您实际 想要 执行的练习条款,当然。在这种情况下,您可能希望将 line-by-line 结果写入临时文件,然后将它们相加作为输出。

如果您无论如何都在使用 Awk,那么在 Awk 中实现所有逻辑是有意义的。

awk -v name="" -F : ' == name { ++found }
  END { if (found) printf "Found %i instances of %s\n", found, name
     else printf "Not found: %s\n", name }' "$HOME/name_list.txt"

假设你只想显示一次“未找到”消息......你可以尝试这样的事情:

names=$(awk -F'[:]' '{print }' name_list.txt)
IFS=$'\n'
name=
found=0

name_list(){
for i in $names; do
    if [ "$i" == "$name" ];then  #name is user input from scriptfile.
      echo "person found at line $(grep -n $name name_list.txt | cut -d: -f1)"
      found=1
      break
    fi
done

if [ $found == 0 ]
then
    echo "Couldn't find anyone with given name"
fi
}

我只在 AWS 行中添加了 -F'[:]' + IFS=$'\n'.