尝试执行脚本来搜索文件中的用户输入
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'.
我正在尝试学习 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'.