2010-02-19 8 views
6

Est-il possible de faire un grep avec des mots-clés stockés dans le tableau.Est-il possible de faire un grep avec des mots-clés stockés dans le tableau?

Voici l'extrait de code possible ... S'il vous plaît la corriger

args=("key1" "key2" "key3") 

cat file_name |while read line 
echo $line | grep -q -w ${args[c]} 
done 

En ce moment, je peux chercher un seul mot clé. Je voudrais rechercher tous les mots-clés qui est stocké dans args tableau.

Toute suggestion serait grandement appréciée.

Merci, Kiran

+1

Bien que pas vraiment une solution, mais chat est utilisé pour concaténer des fichiers, s'il n'y a qu'un seul fichier, utilisez la directive d'entrée: tout en ligne de lecture echo $ line | grep -q -w $ {args [c]} fait Residuum

+0

Merci beaucoup .. Je suis habitué à le faire en voyant d'autres exemples .. didnt le réaliser .. merci une tonne – Kiran

Répondre

5
args=("key1" "key2" "key3") 
pat=$(echo ${args[@]}|tr " " "|") 
grep -Eow "$pat" file 

Ou avec la coquille

args=("key1" "key2" "key3") 
while read -r line 
do 
    for i in ${args[@]} 
    do 
     case "$line" in 
      *"$i"*) echo "found: $line";; 
     esac 
    done 
done <"file" 
+0

Merci beaucoup .. Cela a fonctionné. :) – Kiran

0

peut-être quelque chose comme ça;

cat file_name |while read line 
for arg in ${args[@]} 
do 
echo $line | grep -q -w $arg} 
done 
done 

non testé!

+0

Eh bien, je dois rechercher à la fois les mots-clés en même temps quelque chose comme $ {args [*]} ou avec egrep avec plusieurs mots-clés. Une idée? – Kiran

1

La commande

(IFS="|" ; grep --perl-regexp "${args[*]}") <file_name 

recherche dans le fichier pour chaque mot-clé dans un tableau. Il le fait en construisant l'expression régulière word1|word2|word3 qui correspond à n'importe quel mot des alternatives données (en mode perl).

Si je il y a un moyen de joindre les éléments du tableau dans une chaîne, les délimitant avec séquence de caractères (à savoir, \|), il pourrait être fait sans perl regexp.

+0

Sur mon système, c'est singulier: '--perl-regexp'. Aussi, utilisation inutile de 'cat'. –

+0

@Dennis, merci, corrigé. Au fait, je peux discuter de chat. –

+0

'(IFS ... grep ... nom_fichier)' - pas besoin de redirection. Est-ce que votre 'grep' a vraiment un" s "dans' --perl-regexp'? –

3

C'est une façon:

args=("key1" "key2" "key3") 
keys=${args[@]/%/\\|}  # result: key1\| key2\| key3\| 
keys=${keys// }   # result: key1\|key2\|key3\| 
grep "${keys}" file_name 

Edit:

Basé sur suggestion de Pavel Shved:

(IFS="|"; keys="${args[*]}"; keys="${keys//|/\\|}"; grep "${keys}" file_name) 

La première version comme une doublure:

keys=${args[@]/%/\\|}; keys=${keys// }; grep "${keys}" file_name 

Edit2:

Encore mieux que la version en utilisant IFS:

printf -v keys "%s\\|" "${args[@]}"; grep "${keys}" file_name 
+0

pouvez-vous expliquer comment fonctionne votre solution? Je suis bloqué à comprendre le but de% dans vos arguments de modèle [@] /%/\\ | – Sharad

+0

@Sharad: Regardez dans le manuel] Bash à Shell Expansion des paramètres] (https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) dans l'avant-dernier paragraphe. L'affectation dans mon exemple 'keys = $ {args [@] /%/\\ |}' dit de remplacer ('/') la fin ('%') de chaque élément du tableau ('args [@]') avec ('/') un backslash et un pipe ('\\ |'). Donc, il ajoute ces caractères puisque la "fin" (un '%' suivi par aucun autre caractère à correspondre) est juste que - aucun caractère n'est enlevé pendant le "remplacement" dans ce cas. –

2

Vous pouvez utiliser la magie d'extension bash préfixe chaque élément avec -e et passer chaque élément de l'arra y en tant que motif séparé. Cela peut éviter certains problèmes de précédence où vos modèles peuvent interagir mal avec le | opérateur:

$ grep ${args[@]/#/-e } file_name 

L'inconvénient est que vous ne pouvez pas avoir des espaces dans vos habitudes parce que cela va diviser les arguments à grep. Vous ne pouvez pas mettre de guillemets autour de l'expansion ci-dessus, sinon vous obtenez "-e pattern" comme un seul argument pour grep.