Bash脚本搜索annuaire.txt特定字段行失败问题求助
问题分析与解决
你的rechercherFiche函数里的grep命令存在两个核心问题:
- 语法错误:
grep -q $recherche $prenomPersonne annuaire.txt中,$prenomPersonne在当前函数里未定义(该变量仅在ajoutPersonne函数内有效),导致grep会把它当作不存在的文件名参数,直接执行失败。 - 逻辑错误:普通grep会匹配整行任意位置的内容,无法限定到你想要的特定字段(比如姓名字段),不符合你“匹配对应字段所在行”的需求。
针对你的需求(输入单个字符匹配对应字段的行),以下提供两种修正方案,以匹配**第二列(prenomPersonne)**为例:
方案1:用awk精确匹配指定字段
awk适合处理CSV格式的字段匹配,能精准定位到某一列:
function rechercherFiche(){ read -p "Rechercher : " recherche # 用awk匹配第二列包含输入内容的行 resultats=$(awk -v mot="$recherche" -F ',' '$2 ~ mot' annuaire.txt) if [ -n "$resultats" ]; then echo "$(echo "$resultats" | wc -l) resultats trouvés !" echo "$resultats" else echo "Non trouvée dans l'annuaire." fi }
-F ',':指定逗号为字段分隔符$2 ~ mot:判断第二列是否包含输入的mot变量内容- 用
wc -l统计匹配行数,避免重复执行awk
方案2:用grep配合正则匹配指定字段
如果坚持用grep,可以用正则表达式限定匹配的列位置(比如第二列,前后是逗号或行首/行尾):
function rechercherFiche(){ read -p "Rechercher : " recherche # 正则匹配第二列包含输入内容的行:行首或逗号后,接着包含输入内容,后面跟逗号或行尾 if grep -q "^[^,]*,[^,]*$recherche[^,]*," annuaire.txt; then count=$(grep -c "^[^,]*,[^,]*$recherche[^,]*," annuaire.txt) echo "$count resultats trouvés !" grep "^[^,]*,[^,]*$recherche[^,]*," annuaire.txt else echo "Non trouvée dans l'annuaire." fi }
- 正则
^[^,]*,[^,]*$recherche[^,]*的含义:^[^,]*:匹配行首到第一个逗号的内容(第一列),:字段分隔符[^,]*$recherche[^,]*:匹配包含输入内容的第二列部分,:第二列后的分隔符(若匹配最后一列可改为$)
额外注意事项
- 变量引用要加双引号,比如
"$recherche",避免输入包含空格或特殊字符时出错 - 如果需要让用户选择搜索哪个字段,可以在函数开头加选择步骤,比如让用户输入1-5对应不同字段,再动态调整awk的
$n或grep的正则
内容的提问来源于stack exchange,提问作者User1010
相关产品推荐
相关产品推荐

