J'ai de très longs fichiers journaux, est-il possible de demander à grep de ne rechercher que les 10 premières lignes?
La magie des pipes;
head -10 log.txt | grep <whatever>
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
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.
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
.
grep "pattern" <(head -n 10 filename)
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
Vous pouvez utiliser la ligne suivante:
head -n 10 /path/to/file | grep [...]
grep -m6 "string" cov.txt
Ceci recherche seulement les 6 premières lignes pour string
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.
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)
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.
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".