grep: pas un drapeau reconnu dans AIX

J'essaye d'écrire un shell qui va chercher un set de données de la table et l'écrire dans un file text dont le nom est result.txt . Maintenant, je vais sélectionner chaque ligne de ce file et le searchr dans un file journal et vérifier s'il est présent ou non. S'il n'est pas trouvé dans le file journal, je veux l'écrire dans un file distinct, dis notfound.txt . Je travaille sur un server AIX et get cette erreur ci-dessous pour la command grep . Quelqu'un peut-il m'aider à comprendre ce qui ne va pas?

Voici mon script,

 while read -r LINE; do grep -q "$LINE" log.log if [ $? -eq 0 ] then echo "$LINE" >> /home/notfound.txt fi done < result.txt 

qui me donne la sortie suivante,

grep: Pas un indicateur reconnu: – Utilisation: grep [-R] [-R] [-H] [-L] [-E | -F] [-c | -l | -q] [-insvxbhwyu] p [parasep]] -e list_templates … [-f file_model …] [file …]

Utilisation: grep [-r] [-R] [-H] [-L] [-E | -F] [-c | -l | -q] [-insvxbhwyu] [-p [parasep] pattern_list …] -f pattern_file … [file …]

Utilisation: grep [-r] [-R] [-H] [-L] [-E | -F] [-c | -l | -q] [-insvxbhwyu] [-p [parasep] …]

On dirait que $LINE contient une valeur qui commence par un tiret.

Vous pouvez vous protéger contre

 grep -q -e "$LINE" 

Plus généralement, la plupart des commands Unix permettent -- de marquer la fin des options, et donc tout argument après cette option "fin d'options" sera pris comme un argument littéral, sans option.

echo aura aussi un problème; la solution portable est de passer à printf , qui fonctionne bien avec des arguments qui commencent par des tirets, tant que ce n'est pas le premier argument, qui est une string de format.

Vous devriez également éviter d'utiliser des noms de variables majuscules; ceux-ci sont réservés à l'utilisation du système.

Enfin, les scripts ne devraient presque jamais avoir besoin d'examiner explicitement $? – ceci est déjà fait par if , while et d'autres constructions de contrôle.

 if grep -q -e "$line" log.log; then printf '%s\n' "$line" fi 

En tant qu'optimization, placer la redirection en dehors de la boucle rendra les choses beaucoup plus rapides.

 while read -r line; do grep -q -e "$line" log.log && printf '%s\n' "$line" done <results.txt >notfound.txt