2011-09-28 3 views
2

J'ai un dossier contenant un ensemble de fichiers texte.Linux rechercher plusieurs mots dans un fichier

-Folder 
--- file 1 
--- file 2 
--- file 3 
--- file 4 

J'ai un ensemble de mots que je veux vérifier si sont à l'intérieur. {word1, username, blah blahblah}

Y at-il un moyen sur une seule commande de découvrir lequel de ces fichiers contient tout le mot dans ma liste?

J'ai vu qu'il est possible d'utiliser certains et avec grep mais je pense qu'ils fonctionnent sur une seule ligne alors que dans mon cas les wors sont toujours sur des lignes différentes.

le nombre de mots est statique. sont toujours 3 ou 4 donc si nécessaire, je peux les coder en dur dans la commande.

EDIT: Ils sont dans AND. un fichier n'est pas accepté si tous ne sont pas à l'intérieur! je voudrais éviter de faire egrep -l 'mot1'. xargs egrep -l 'mot2'

Existe-t-il une meilleure solution pour appeler grep une seule fois?

Cheers, Ste

Répondre

7

Cela fonctionne pour vous?

grep -IRE 'word1|username|blah blahblah' /path/to/files/ | 
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' | 
awk -F: '$1!=p{if(b"" && c > 2)print b; p=$1;c=0;b=s=""}{b=b s $0;s=RS;c++}END 
{if(b"" && c > 2)print b}' | awk -F: '{print $1}' | sort -u 

La première partie (grep) listera tous les noms de fichiers avec le motif correspondant. La seconde partie (sed) supprimera les doublons de la première sortie en ne donnant que des lignes distinctes. La troisième partie montrera seulement le dossier qui se produit plus d'une fois et le quatrième dépouillera votre modèle assorti et le dernier vous servira seulement le nom de dossier mon ami. Ma tête me fait mal ...

4

utilisation:

grep -f words.txt input 

Exemple:

$ cat words 
word1 
username 
blah blahbla 

a 
word1 
username blah blahblah 
b 
username blah blahblah 
c 
word1 
d 
word1, username, blah blahblah} 

$ grep -f words.txt * 
a:word1 
a:username blah blahblah 
b:username blah blahblah 
c:word1 
d:word1, username, blah blahblah} 
3

Utilisez grep:

grep -E '(word1|username|blah blahblah)' Folder/* 

le drapeau -E met en grep mode "étendu" pour les expressions régulières. Cela affichera par défaut le nom de fichier ET le texte correspondant. Si vous voulez juste le nom de fichier, ajoutez -l aux options.

+0

ne fonctionne pas.dans le fichier de te dossier en cours contient 1 mot1 mot2 mot3 word4 word5 (ligne différente) si je peux utiliser grep -E '(mot1 | mot2). je deviens vide – Stefano

+0

Certaines distributions ont aussi un 'egrep' qui est le même que' grep -E' et toutes les autres options sont les mêmes que 'grep'. –

1

Une autre solution, qui fonctionne le mieux pour un petit ensemble de mots:

grep -e word1 -e username -e "blah blahblah" Folder/* 
+0

le problème est que cela me renvoie plusieurs fois le nom du fichier. existe-t-il un moyen d'éviter les doublons? – Stefano

1

ci-dessous si vous voulez grep dans une arborescence de répertoires

egrep -E '{word1|username|blah blahblah)' `find . -type f -print` 

Je vous suggère également d'utiliser le terme répertoire au lieu du dossier lorsque vous cherchez des réponses sur les systèmes * nix :-)

Questions connexes