GNU/Linux >> Tutoriels Linux >  >> Linux

Rechercher des fichiers texte contenant deux mots différents (n'importe quel ordre, n'importe quelle ligne) ?

Je cherche un moyen de rechercher des fichiers où deux instances de mots existent dans le même fichier. J'ai utilisé les éléments suivants pour effectuer mes recherches jusqu'à présent :

find . -exec grep -l "FIND ME" {} ;

Le problème que je rencontre est que s'il n'y a pas exactement un espace entre "TROUVER" et "MOI", le résultat de la recherche ne donne pas le fichier. Comment puis-je adapter l'ancienne chaîne de recherche où les deux mots "TROUVER" et "MOI existent dans un fichier par opposition à "TROUVEZ-MOI" ?

J'utilise AIX.

Réponse acceptée :

Avec les outils GNU :

find . -type f  -exec grep -lZ FIND {} + | xargs -r0 grep -l ME

Vous pouvez faire en standard :

find . -type f -exec grep -q FIND {} ; -exec grep -l ME {} ;

Mais cela exécuterait jusqu'à deux grep s par fichier. Pour éviter d'exécuter autant de grep s et toujours portable tout en autorisant n'importe quel caractère dans les noms de fichiers, vous pouvez faire :

convert_to_xargs() {
  sed "s/[[:blank:]"']/\\&/g" | awk '
    {
      if (NR > 1) {
        printf "%s", line
        if (!index($0, "//")) printf "\"
        print ""
      }
      line = $0
    }'
    END { print line }'
}

export LC_ALL=C
find .//. -type f |
  convert_to_xargs |
  xargs grep -l FIND |
  convert_to_xargs |
  xargs grep -l ME

L'idée étant de convertir la sortie de find dans un format adapté à xargs (qui attend un blanc (SPC/TAB/NL dans le C locale, YMMV dans d'autres locales) liste de mots séparés où les guillemets simples, doubles et les barres obliques inverses peuvent s'échapper les blancs et les uns les autres).

Généralement, vous ne pouvez pas post-traiter la sortie de find -print , car il sépare les noms de fichiers par un caractère de saut de ligne et n'échappe pas aux caractères de saut de ligne qui se trouvent dans les noms de fichiers. Par exemple, si nous voyons :

./a
./b

Nous n'avons aucun moyen de savoir s'il s'agit d'un fichier appelé b dans un répertoire appelé a<NL>. ou si ce sont les deux fichiers a et b dans le répertoire courant.

En utilisant .//. , car // ne peut pas apparaître autrement dans un chemin de fichier en sortie de find (parce qu'il n'y a pas de répertoire avec un nom vide et / n'est pas autorisé dans un nom de fichier), nous savons que si nous voyons une ligne qui contient // , alors c'est la première ligne d'un nouveau nom de fichier. Nous pouvons donc utiliser ce awk commande pour échapper tous les caractères de retour à la ligne sauf ceux qui précèdent ces lignes.

Si nous prenons l'exemple ci-dessus, find afficherait dans le premier cas (un fichier) :

.//a
./b

Quel awk s'échappe vers :

.//a
./b

Alors que xargs y voit un argument. Et dans le second cas (deux fichiers) :

.//a
.//b

Quel awk laisserait tel quel, donc xargs voit deux arguments.

Connexe :le mode souris Tmux activé ne permet pas de sélectionner du texte avec la souris ?

Vous avez besoin du LC_ALL=C donc sed , awk (et quelques implémentations de xargs ) fonctionnent pour des séquences arbitraires d'octets (même si elles ne forment pas de caractères valides dans les paramètres régionaux de l'utilisateur), pour simplifier le vide définition à juste SPC et TAB et pour éviter les problèmes d'interprétations différentes des caractères dont l'encodage contient l'encodage de l'antislash par les différents utilitaires.


Linux
  1. Comparez deux colonnes de fichiers différents et imprimez si cela correspond ?

  2. Extraire la valeur entre deux modèles de recherche sur la même ligne ?

  3. Comment rechercher des fichiers par taille et extension ?

  4. Linux – Où sont les métadonnées pour les fichiers PDF ? Puis-je insérer des métadonnées dans n'importe quel fichier PDF ?

  5. Rechercher des fichiers dont les chemins d'accès contiennent plusieurs mots sans ordre spécifique entre eux ?

Newsboat - Un lecteur de flux RSS / Atom en ligne de commande pour les consoles de texte

Comment ajouter des numéros de ligne aux fichiers texte sous Linux

Comment rechercher des fichiers à partir de la ligne de commande Linux

Comment trouver des fichiers contenant une chaîne de texte spécifique sous Linux

Linux :supprimer les extensions de fichiers pour plusieurs fichiers

Trouvez n'importe quelle ligne dans VI qui a quelque chose d'autre que ATCG