Puis-je grep seulement les N premières lignes d'un fichier?
J'ai des fichiers journaux Très longs, est-il possible de demander à grep de ne Rechercher que les 10 premières lignes?
11 réponses
La magie des tuyaux;
head -10 log.txt | grep <whatever>
Pour les gens qui trouvent cela sur Google, j'avais besoin de rechercher les premières lignes n
de plusieurs fichiers, mais d'imprimer uniquement les noms de fichiers correspondants. J'ai utilisé
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
Le FNR..nextfile
arrête le traitement d'un fichier une fois que 10 lignes ont été vues. Le //..{}
imprime le nom de fichier et se déplace à chaque fois que la première correspondance dans un fichier donné apparaît. Pour citer les noms de fichiers au profit d'autres programmes, utilisez
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
Ou utilisez awk
pour un seul processus sans |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Sur chaque ligne, si your_regexp
correspond, et le nombre d'enregistrements (lignes) est inférieur à 11, il exécute l'action par défaut (qui est de l'impression de la ligne de saisie).
Ou utiliser sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Vérifie votre expression rationnelle et imprime la ligne (-n
signifie Ne pas imprimer l'entrée, qui est sinon la valeur par défaut), et se ferme juste après la 10ème ligne.
Vous avez quelques options en utilisant des programmes avec grep
. Le plus simple à mon avis est d'utiliser head
:
head -n10 filename | grep ...
head
affiche les 10 premières lignes (en utilisant l'option -n
), puis vous pouvez rediriger cette sortie vers grep
.
Vous pouvez utiliser la ligne suivante:
head -n 10 /path/to/file | grep [...]
La sortie de head -10 file
peut être joué à grep
pour ce faire:
head -10 file | grep …
En Utilisant Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
Grep-A 10
C'est pour saisir le motif et les 10 lignes suivantes après le motif. Cela ne fonctionnerait bien que pour un modèle connu, si vous n'avez pas de modèle connu, utilisez les suggestions "head".
Tête -10 journal.txt / grep-a 2-B 2 pattern_to_search
Tête -10 journal.txt : lire les 10 premières lignes du fichier.
- a 2: imprimer deux lignes avant le motif.
- B 2: imprimer deux lignes après le motif.
Une extension de la réponse de Joachim Isaksson: très souvent, j'ai besoin de quelque chose du milieu d'un fichier long, par exemple les lignes 5001 à 5020, auquel cas vous pouvez combiner head
avec tail
:
head -5020 file.txt | tail -20 | grep x
Cela obtient les 5020 premières lignes, puis ne montre que les 20 dernières, puis tout achemine vers grep.
(édité: erreur fencepost dans Mes numéros d'exemple, ajouté pipe à grep)
J'ai eu un problème similaire et tout le problème ci-dessus ne résolvent pas entièrement. Je suis également intéressé à obtenir le nom de fichier contenant les lignes correspondantes. Ma solution:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
N. B: le motif dans mon cas correspond toujours à la première ligne.