GNU/Linux >> Tutoriels Linux >  >> Linux

Chaîne Grep où la ligne suivante ne contient pas de chaîne ?

Je souhaite rechercher dans tous les fichiers d'un répertoire et de ses sous-répertoires des lignes contenant une certaine chaîne, mais je souhaite exclure les résultats contenant une certaine chaîne différente dans la ligne qui la suit immédiatement.

Par exemple, ceci :

foo1 searchString bar
foo1 excludeString bar

foo2 searchString bar
something else

foo3 searchString bar

foo3 excludeString bar

foo4 searchString bar

devrait renvoyer ceci :

foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Je sais que -A imprime plusieurs lignes, et que -v exclut les résultats. Mais mon approche actuelle de grep -r -A 1 "searchString" | grep -v "excludeString" ne peut évidemment pas fonctionner.

Existe-t-il un moyen de dire au deuxième grep qu'il doit également supprimer la ligne précédente s'il trouve une correspondance ? Ou d'une autre façon comment je pourrais y parvenir ?

La performance n'est pas ma principale préoccupation; Ce serait bien si la commande était relativement facile à retenir.

Réponse acceptée :

Vous pouvez utiliser p erl c r compatible e régulier xpressions grep :

$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Il recherche searchString suivi de n'importe quel caractère . , répété zéro ou plusieurs fois * , suivi d'une nouvelle ligne \n uniquement s'il n'y en a pas (?! ) modèle .*excludeString à côté de cela. Option -M est présent afin de correspondre à plusieurs lignes.


Linux
  1. Comment Greper les lignes qui ne commencent pas par "#" ou ";" ?

  2. Pourquoi le fichier de traduction Bash ne contient-il pas tous les textes d'erreur ?

  3. Vsftpd ne répertorie pas le contenu d'un répertoire ?

  4. Pourquoi `exit &` ne fonctionne pas ?

  5. CentOS/RHEL :Échec de la commande de montage avec "mount :ne contient pas d'étiquettes SELinux"

Comment trouver une chaîne dans un fichier sous Linux

Lsb_release - Impossible de convertir la chaîne en flottant :'8.04 Lts' ?

grep :commande introuvable

Ajouter une ligne à un fichier uniquement s'il n'existe pas déjà

\d n'est-il pas pris en charge par les expressions de base de grep ?

Que fait 'bash -c' ?