Lecture de modèles grep à partir d'un fichier


49

J'ai quelques gros fichiers texte et dans le fichier, UNIQS.txtj'ai une liste de chaînes grepd'un autre fichier. Le code que j'utilise est

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

qui ne fait rien - le fichier généré est vide. Mais quand je fais

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

cela fonctionne correctement. Cela me trouble parce que je ne pensais pas que greples entrées seraient interprétées UNIQS.txtcomme des modèles d’expression rationnelle sans guillemets ni barres obliques, etc. dans le fichier (ce qui n’existe pas). Est-il généralement vrai que si vous récupérez les patterns à partir d’un fichier, il pensera automatiquement qu’il s’agit de patterns regexp?

Edit: Dans le UNIQS.txtfichier, il y a des chaînes du formulaire séparées par une nouvelle ligne

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(appelés noms de modèles) et les EEP_VSL...colonnes séparées par des tabulations de fichier , avec environ 14 colonnes et la première colonne est le nom du modèle, donc je veux fondamentalement extraire la ligne correspondant à chaque modèle dans le fichier.

Réponses:


60

L' -foption spécifie un fichier où grep lit les modèles. C'est comme si vous transmettiez des modèles sur la ligne de commande (avec l' -eoption s'il en existe plusieurs), sauf que lorsque vous appelez depuis un shell, vous devrez peut-être citer le modèle pour éviter que le caractère ne développe ses caractères spéciaux.

L'argument -Eou -Fou -P, le cas échéant, indique à grep la syntaxe dans laquelle les modèles sont écrits. En l'absence d'argument, grep attend des expressions régulières de base ; avec -E, grep attend des expressions régulières étendues ; avec -P(si supporté), grep attend les expressions régulières Perl ; et avec -F, grep attend des chaînes littérales. Que les modèles proviennent de la ligne de commande ou d'un fichier n'a pas d'importance.

Notez que les chaînes sont des sous-chaînes: si vous passez a+bcomme un motif, une ligne contenant a+b+ccorrespond. Si vous souhaitez rechercher des lignes contenant exactement l'une des chaînes fournies et pas plus, passez l' -xoption.


1
Ok c'est utile merci. Puis-je demander, supposons que je veuille faire correspondre la chaîne exactement, c.-à-d. Si la chaîne est 12345 alors je veux qu'elle corresponde à 12345 seulement, pas à 123456 ou 123455, etc., comment ferais-je pour ce faire?
sdf

2
@sdf Lisez mon dernier paragraphe:-x
Gilles 'SO- arrête d'être méchant'

C'est si vieux, désolé de l'avoir découvert. Bien que l'explication ci-dessus soit géniale, il est un peu vague de savoir pourquoi les modèles (chaînes) du fichier ne correspondent pas sans l' -Findicateur. À mon avis, la ligne -dans l'exemple ci-dessus entraîne-t-elle la lecture d'une séquence de caractères? Cela ne nécessiterait-il pas aussi des crochets? J'ai testé avec quelques exemples de fichiers mais je ne suis pas parvenu à une conclusion.
très

@trs La ligne affichée dans la question (qui a été ajoutée après que j'ai posté ma réponse) ne contient aucun caractère ayant une signification particulière dans les expressions rationnelles, elle se comporte donc de la même manière avec et sans -F. Cela ferait une différence avec des personnages tels que \[*^$.
Gilles, arrête de faire le mal

@Gilles merci, c'était aussi mon impression mais le @sdf prétend "le fichier généré est vide" (lire: pas de correspondance) sans le -Fdrapeau?
très

0

J'ai eu la même erreur, pas résolu avec la bonne réponse de @gilles. En regardant de plus près dans le fichier d'entrée, j'ai trouvé 2 nouvelles lignes à la fin. Sans ces éléments, le succès n’est nécessaire que: grep -i fichier_pattern_input

(GNU grep 3.1, fichier d’entrée de plus de 5 000 enregistrements, fichier de correspondance / modèle 2536, je savais que tous les 2536 devaient figurer dans le fichier. Avec les nouvelles lignes, toutes les lignes du fichier et sans les 2536 lignes correspondantes)


1
Cela n’a aucun rapport avec le problème de OP. Une ligne vide est lue par grep en tant que modèle vide et un modèle vide correspond partout.
Muru
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.