web-dev-qa-db-fra.com

Puis-je grep uniquement les n premières lignes d'un fichier?

J'ai de très longs fichiers journaux, est-il possible de demander à grep de ne rechercher que les 10 premières lignes?

107
David LeBauer

La magie des pipes;

head -10 log.txt | grep <whatever>
149
Joachim Isaksson

Pour les personnes qui trouvent cela sur Google, je devais effectuer une recherche dans les premières n lignes de plusieurs fichiers, mais uniquement imprimer les noms de fichiers correspondants. j'ai utilisé

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

Le FNR..nextfile arrête de traiter un fichier lorsque 10 lignes ont été vues. Le //..{} imprime le nom du fichier et continue chaque fois que la première correspondance d'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
44
cxw

Ou utilisez awk pour un processus unique sans |:

awk '/your_regexp/ && NR < 11' INPUTFILE

Sur chaque ligne, si your_regexp correspond et si le nombre d'enregistrements (lignes) est inférieur à 11, l'action par défaut (l'impression de la ligne d'entrée) est exécutée.

Ou utilisez sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

Vérifie votre expression rationnelle et imprime la ligne (-n signifie que vous n'imprimez pas l'entrée, ce qui est sinon la valeur par défaut), puis se ferme juste après la 10e ligne.

23
Zsolt Botykai

Vous avez quelques options en utilisant des programmes avec grep. Le plus simple à mon avis est d'utiliser head:

head -n10 filename | grep ...

head produira les 10 premières lignes (à l'aide de l'option -n), puis vous pourrez diriger cette sortie vers grep.

8
Dan Fego
grep "pattern" <(head -n 10 filename)
4
jaypal singh

La sortie de head -10 file peut être transmise à grep afin d'accomplir ceci:

head -10 file | grep …

Utiliser Perl:

Perl -ne 'last if $. > 10; print if /pattern/' file
3
Alan Haggai Alavi

Vous pouvez utiliser la ligne suivante:

head -n 10 /path/to/file | grep [...]
2
Gustavo Straube
grep -m6 "string" cov.txt

Ceci recherche seulement les 6 premières lignes pour string

2
Dileepa Chandima
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: imprime deux lignes avant le motif.

-B 2: imprime deux lignes après le motif.

head -10 log.txt # read the first 10 lines of the file.
2
vins

Une extension de la réponse de Joachim Isaksson: Très souvent, j'ai besoin de quelque chose du milieu d'un long fichier, par exemple. 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 dirige le tout vers grep.

(Édité: erreur fencepost dans mes exemples, ajout de pipe à grep)

1
RoG

J'ai eu un problème similaire et tout le problème ci-dessus ne le résout pas entièrement. Je souhaite également obtenir le nom du fichier contenant les lignes correspondantes. Ma solution:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

N.B: Dans mon cas, le motif correspond toujours à la première ligne.

0
Shokrof

grep -A 10 <modèle>

Ceci est pour saisir le motif et les 10 lignes suivantes après le motif. Cela ne fonctionnerait bien que pour un motif connu, si vous n'avez pas de motif connu, utilisez les suggestions "tête".

0
snowtop