166 votes

grep pour 2 mots existant sur la même ligne

comment puis-je grep pour les lignes qui contiennent deux mots d'entrée sur la ligne ? Je recherche les lignes qui contiennent les deux mots, comment faire ? J'ai essayé de pipe comme ceci :

 grep -c "word1" |grep -r "word2" logs

il se bloque juste après la première commande pipe. Pourquoi ?

219voto

houbysoft Points 9773

Pourquoi vous passez -c ? Cela ne fera qu'indiquer le nombre de correspondances. De même, il n'y a aucune raison d'utiliser -r . Je vous suggère de lire man grep .

Pour rechercher 2 mots existant sur la même ligne, il suffit de faire :

grep "word1" FILE | grep "word2"

grep "word1" FILE imprimera toutes les lignes de FILE contenant le mot 1, et ensuite grep "word2" imprimera les lignes qui contiennent le mot 2. Par conséquent, si vous les combinez en utilisant un pipe, les lignes contenant à la fois le mot1 et le mot2 seront affichées.

Si vous voulez simplement compter combien de lignes ont les deux mots sur la même ligne, faites-le :

grep "word1" FILE | grep -c "word2"

De plus, pour répondre à votre question, pourquoi est-ce que ça reste bloqué : en grep -c "word1" vous n'avez pas spécifié de fichier. Par conséquent, grep attend une contribution de stdin C'est pourquoi il semble se bloquer. Vous pouvez appuyer sur Ctrl + D pour envoyer un EOF (end-of-file) afin qu'il quitte.

109voto

Jonathan Leffler Points 299946

Vous pourriez utiliser des grep ( grep -E ou egrep ) :

grep -E 'word1.*word2|word2.*word1' "$@"

Si vous savez que le mot1 précédera le mot2 sur la ligne, vous n'avez même pas besoin des alternatives et des régulières. grep ferait :

grep 'word1.*word2' "$@"

12voto

vous pourriez utiliser awk. comme ceci...

cat <yourFile> | awk '/word1/ && /word2/'

L'ordre n'est pas important. Donc si vous avez un dossier et...

un fichier nommé , fichier1 contient :

word1 is in this file as well as word2
word2 is in this file as well as word1
word4 is in this file as well as word1
word5 is in this file as well as word2

alors,

/tmp$ cat file1| awk '/word1/ && /word2/'

aura pour résultat,

word1 is in this file as well as word2
word2 is in this file as well as word1

Oui, l'awk est plus lent.

7voto

sysboy Points 41

Le problème principal est que vous n'avez pas fourni d'entrée au premier grep. Vous devrez réorganiser votre commande de la manière suivante

grep "word1" logs | grep "word2"

Si vous voulez compter les occurrences, mettez un '-c' sur le deuxième grep.

4voto

user2724604 Points 31

Vous pouvez essayer avec la commande suivante

cat log|grep -e word1 -e word2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X