shell 使用脚本bash搜索文件中的特定行(记录)

uplii1fm  于 2022-12-19  发布在  Shell
关注(0)|答案(1)|浏览(206)

我有一个名为annuaire.txt的文件,其中包含用户使用read输入的记录,我想搜索特定行$var,如$nomPersonne,我使用了if grep -q $recherche $prenomPersonne annuaire.txt,但没有工作。
就像我有一个读命令用户可以输入一个字母,他要找什么,但只有在一行中的文件该行是这些变量之一:$nomPersonne $prenomPersonne $编号办公室$编号电话$地址电子邮件

function ajoutPersonne(){
 read -p "Saisir le nom : " nomPersonne
 read -p "Saisir le prénom : " prenomPersonne
 read -p "Saisir le numéro de bureau : " numBureau
 read -p "Saisir le numéro de téléphone : " numTelephone
 read -p "Saisir votre adresse email : " adresseEmail
 echo "$nomPersonne,$prenomPersonne,$numBureau,$numTelephone,$adresseEmail" >> annuaire.txt
}

function rechercherFiche(){
read -p "Rechercher : " recherche
if grep -q $recherche $prenomPersonne annuaire.txt
then
  echo "$(grep -c $recherche annuaire.txt) resultats trouvés !"
  grep -r $recherche annuaire.txt
else
    echo "Non trouvée dans l'annuaire."
fi
}

这是法语的,不要介意变量的名字。

AJLI,Zakaria,10,1234567890,bbb@ajli.fr
pers,perss,20,2345446675,ccc@pers.fr
potion,asterix,9,111111111,ddd@potion.fr
marmite,obelix,33,8687678576,yyy@marmite.fr
rsl1atfo

rsl1atfo1#

你不需要在你的grep中使用prenomPersonne。
我建议的脚本编辑(基于评论的第二次迭代)如下所示:

function rechercherFiche(){
        while [ true ]
    do
        read -p "Rechercher : " recherche
        if [ "" = "$( echo "${recherche}" | sed "s/[[:alpha:]]//g" | sed "s/[\ \t]//g" | sed "s/[.-]//g" )" ]
        then
            #retour=$(grep -q $recherche $prenomPersonne annuaire.txt)
            retour=$( grep $recherche annuaire.txt )
            if [ -n "${retour}" ]
            then
                #echo "$( echo "${retour}" | grep -c "${recherche}" ) resultats trouvés !"
                echo -e "\t$( echo "${retour}" | wc -l | awk '{ print $1 }' ) resultats trouvés !"
                echo -e "\t${retour}"
                rm -f annuaire.txt
                break
            else
                echo -e "\tNon trouvé dans l'annuaire ...\n"
            fi
        else
            echo -e "\tAucun chiffre permis pour la recherche ...\n"
        fi
    done
}

这种方法只访问“annuaire.txt”文件一次,而您原来的方法访问了3次,在第一次尝试时将结果保存为变量可以减少总体开销。
如果要同时搜索名字和姓氏,则语句应为:

read -p "Rechercher (nom,prenom): " recherche
retour=$( grep "${recherche}" annuaire.txt )

或者你可以用两个数据点来做:

read -p "Rechercher le nom: " nom
read -p "     et le prenom: " prenom
retour=$( grep "${nom}" annuaire.txt | grep "${prenom}" )

double grep允许可能的反向输入,但仍然会给予有效的结果。

相关问题