J'ai des fichiers journaux très longs, est-il possible de demander à grep de ne rechercher que les 10 premières lignes?
J'ai des fichiers journaux très longs, est-il possible de demander à grep de ne rechercher que les 10 premières lignes?
Réponses:
La magie des pipes;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
option grep ? Je voudrais lister tous les fichiers des 5 premiers caractères RIFFD
.
Pour les gens qui trouvent cela sur Google, j'avais besoin de rechercher les premières n
lignes de plusieurs fichiers, mais de n'imprimer que les noms de fichiers correspondants. j'ai utilisé
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
L' FNR..nextfile
arrêt de traiter un fichier une fois que 10 lignes ont été vues. Le //..{}
imprime le nom du fichier et continue 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
FNR=1
Recherche aussi simplement la 1ère ligne. Merci!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Ou utiliser awk
pour un seul processus sans |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Sur chaque ligne, si your_regexp
correspond et que le nombre d'enregistrements (lignes) est inférieur à 11, il exécute l'action par défaut (qui imprime la ligne d'entrée).
Ou utilisez sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Vérifie votre expression régulière 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 10e ligne.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- plus rapide.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
Est-ce que.
awkish
. 2xifs
et 1xelse
dans une commande qui n'a besoin d'aucune instruction d'action ferait aho. weinberger et kernighan pleurent ...
Vous avez quelques options en utilisant des programmes avec grep
. Le plus simple à mon avis est d'utiliser head
:
head -n10 filename | grep ...
head
affichera les 10 premières lignes (en utilisant l' -n
option), puis vous pourrez diriger cette sortie vers grep
.
head
ont utilisé -n 10
(y compris moi) ne réalisant pas que head
par défaut affiche seulement 10 lignes . :)
grep "pattern" <(head -n 10 filename)
Vous pouvez utiliser la ligne suivante:
head -n 10 /path/to/file | grep [...]
La sortie de head -10 file
peut être redirigée vers grep
afin d'accomplir ceci:
head -10 file | grep …
Utilisation de Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2
: imprimez deux lignes avant le motif.
-B 2
: imprimer deux lignes après le motif.
head -10 log.txt # read the first 10 lines of the file.
-C 2
fera la même chose que-A 2 -B 2
grep -m6 "string" cov.txt
Cela recherche uniquement les 6 premières lignes pour string
Une extension de la réponse de Joachim Isaksson: J'ai souvent besoin de quelque chose au milieu d'un long fichier, 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 n'affiche que les 20 dernières de celles-ci, puis redirige tout vers grep.
(Modifié: erreur fencepost dans mes numéros d'exemple, ajout d'un tube à grep)
grep -A 10 <Modèle>
Il s'agit de 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".
J'ai eu un problème similaire et tous les problèmes ci-dessus ne le résolvent pas entièrement. Je suis également intéressé par le nom du fichier contenant les lignes correspondantes. Ma solution:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Le motif dans mon cas correspond toujours à la première ligne.
head
:someCmd | head -10