web-dev-qa-db-fra.com

Comment faire correspondre grep uniquement si la ligne entière correspond?

J'ai ceux-ci:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

Je voulais trouver une correspondance exacte de ABB.log.

Mais quand j'ai fait

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

il montre tous.

Puis-je obtenir ce que je voulais en utilisant grep?

91
Johnyy

Spécifiez simplement les ancres des expressions rationnelles.

grep '^ABB\.log$' a.tmp
94
user562374
grep -Fx ABB.log a.tmp

Depuis la page de manuel de grep:

- F, --fixed-strings
Interprète PATTERN comme une (liste de) chaînes fixes
- x, --line-regexp
Sélectionnez uniquement les correspondances qui correspondent exactement à la ligne entière.

136
John Kugelman

Voici ce que je fais, bien que l'utilisation d'ancres soit le meilleur moyen:

grep -w "ABB.log " a.tmp
24
PranavKN

de même avec awk

 awk '/^ABB\.log$/' file
2
ghostdog74

La plupart des suggestions échoueront s'il ne s'agit que d'un seul espace de début ou de fin, ce qui serait important si le fichier est modifié à la main. Cela le rendrait moins susceptible dans ce cas:

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

Une simple boucle de lecture en boucle dans Shell ferait implicitement ceci:

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp
2
Scrutinizer

Cela a bien fonctionné pour moi lorsque j'essayais de faire quelque chose de similaire:

grep -F ABB.log a.tmp
1
Fred Christophe