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?

88
demandé sur David LeBauer 2012-01-06 22:01:15

11 réponses

La magie des tuyaux;

head -10 log.txt | grep <whatever>
124
répondu Joachim Isaksson 2012-01-06 18:03:53

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
37
répondu cxw 2013-10-30 19:59:52

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.

20
répondu Zsolt Botykai 2017-10-23 12:53:38

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.

7
répondu Dan Fego 2012-01-06 18:03:29
grep "pattern" <(head -n 10 filename)
4
répondu jaypal singh 2012-01-06 18:15:47

Vous pouvez utiliser la ligne suivante:

head -n 10 /path/to/file | grep [...]
2
répondu Gustavo Straube 2012-01-06 18:08:38

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
2
répondu Alan Haggai Alavi 2012-01-06 19:45:57

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".

2
répondu snowtop 2014-09-18 08:34:56

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.

1
répondu vins 2016-06-02 07:24:04

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)

1
répondu RoG 2017-11-16 15:39:54

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.

0
répondu Shokrof 2016-09-02 14:38:58