0
votes

Afficher le nom de fichier et grep match

J'ai plusieurs fichiers texte avec des en-têtes dans le format ci-dessous

nb: le contenu varie en fonction d'un exemple de contenu xxx

Je veux montrer les noms de fichiers et son Contenu correspondant à mon expression par exemple "200 ok"
J'ai essayé plus * | chat | grep -we "200 ok" La commande ci-dessus montre l'expression uniquement sans afficher le nom de fichier et son contenu.

sortie attendu xxx


4 commentaires

Quelle est votre production attendue?


J'ai mis à jour la sortie dans la question


Est 200 ok toujours sur la première ligne?


Non, ça va changer


4 Réponses :


2
votes

Vous pouvez utiliser ce BASH CODE> Script avec Grep code> Production de noms de fichiers correspondants:

while IFS= read -rd '' file; do
    printf '%s\n\n' "$file"
    cat "$file"
done < <(grep -ZlxF '200 OK' *.txt)


7 commentaires

Ne serait pas -x plus sûr que -w ici?


J'avais -x à l'origine mais parfois ces curl comme sorties similaires ont une ligne DOS terminant ou \ r intégré


Son disant Line 2: fichier: aucun fichier ou répertoire de ce type , et il n'affiche pas le contenu


Vous obtenez des noms de fichiers avec grep -zlwf '200 ok' * .txt ?


oui, je reçois le nom de fichier, j'ai la réponse qui est plus compacte


Vous pouvez choisir quelle que soit la réponse que vous aimez, mais en exécutant un pour la boucle sur les noms de fichiers est la buggy et est très découragé. Les noms de fichiers peuvent contenir des espaces et des caractères génériques.


@anubhava: Droite! Mais dans ce cas, je voudrais exécuter un dos2unix sur les fichiers CURL'ED, car les terminaisons \ r vous mordront autrement plus tôt ou tard - par exemple, dans votre printf .



2
votes

Je suggère d'utiliser uniquement du grep.

grep -rnw . -e "searchKey"
  • -R, --Recursive - Recherche de manière récursive dans le répertoire LI>
  • -N, - Numéro d'affichage - Numéro de ligne d'impression avec lignes de sortie LI>
  • -W, Modèle de force de mots-mots pour correspondre à seulement des mots entiers li>
  • . strong> - remplacer par le répertoire li> ul> p>


1 commentaires

J'ai reçu son nom de fichier, mais j'avais besoin du contenu aussi. Mais il s'agit d'une réponse compacte pour trouver le nom de fichier, je suis upvotant pour cela



1
votes

Pourquoi essayez-vous de concaténer les fichiers avec plus et grep après? Vous pouvez simplement faire grep -hew 'ok 200' * . TRUE, alors le nom de fichier serait un préfixe devant toutes les lignes (au lieu d'être affichée une fois au début), mais il serait facile de se déshabiller lors du traitement du résultat (je suppose que vous effectuerez d'autres traitement: -). < / p>

Répondre au commentaire: Vous pouvez faire grep -hew -a 17 'ok 200' * pour voir les 17 lignes après aussi. Mettez un grand nombre si vous souhaitez voir toutes les lignes du fichier. Notez que toutes les lignes seront préfixées avec le nom de fichier.


1 commentaires

J'ai reçu son nom de fichier, mais j'avais besoin du contenu aussi. Mais il s'agit d'une réponse compacte pour trouver le nom de fichier, je suis upvotant pour cela



1
votes

Il suffit de modifier le mot recherché et le dir: pour i in $ (grep -ilr "200 ok" * *); fais-ils echo $ i; Cat $ i; fait


0 commentaires