Comment limiter le nombre de résultats renvoyés par grep?

180

Je voudrais dire 10 lignes maximum de grep.

Je ne veux pas que mon ordinateur travaille dur. Je veux que ça s'arrête après 10 résultats trouvés par grep. C'est possible?

Jas
la source
Dans votre cas, vous ne voulez pas que l'ordinateur travaille dur. Mais s'il s'agit simplement d'un problème de lisibilité humaine, vous pouvez l'utiliser lessvia un tuyau. Cela remplira l'écran et vous pouvez qgrep "SomeText" somefile.csv | less
appuyer

Réponses:

240

L' -moption est probablement ce que vous recherchez:

grep -m 10 PATTERN [FILE]

De man grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

Remarque: grep arrête de lire le fichier une fois que le nombre spécifié de correspondances a été trouvé!

Erik Pilz
la source
3
salut il a essayé cela fonctionne fondamentalement mais il ne semble pas que le grep "arrête" de penser après avoir trouvé les 10 premières lignes, il semble qu'il continue à penser et "en utilisant mon processeur" et tout simplement pas printint c'est correct? thansk
Jas
6
@Jason: cela ne semble pas être le cas: grep prend 0,005s avec -m 1et 1,579s sans sur un fichier de 10 millions de lignes sur mon ordinateur portable.
Grégoire
3
La connexion fonctionne tailgénéralement, mais se décompose en particulier si vous utilisez du contexte, par exemple grep -A10 PATTERN, l'utilisation de tailtronque le contexte, plutôt que le nombre de résultats. Cette réponse était ce que je cherchais.
dimo414
1
-m 10est l'option qui fait la différence lors de la greffe de plusieurs fichiers! La tuyauterie vers la tête n'affiche pas les correspondances dans les fichiers suivants s'il y a trop de correspondances dans le premier fichier. Merci !
Julien
1
IMHO cela devrait être marqué comme la réponse acceptée, car il ne nécessite pas un autre outil. BTW, il est plus facile de se souvenir de cette option en sachant qu'il s'agit du raccourci de --max-count
ishahak
68

Une autre option consiste simplement à utiliser head :

grep ...parameters... yourfile | head

Cela ne nécessitera pas de rechercher le fichier entier - il s'arrêtera lorsque les dix premières lignes correspondantes seront trouvées. Un autre avantage de cette approche est qu'elle ne retournera pas plus de 10 lignes même si vous utilisez grep avec l'option -o.

Par exemple, si le fichier contient les lignes suivantes:

112233
223344
123123

Alors voici la différence de sortie:

$ grep -o '1.' yourfile | head -n2
11
12

$ grep -m2 -o '1.'
11
12
12

L'utilisation headne renvoie que 2 résultats comme souhaité, tandis que -m2 renvoie 3.

Mark Byers
la source
3
Notez que vous ne pouvez pas utiliser le | headtube lors de l'utilisation grepavec -Aou -B(et donc non seulement pour la recherche de result ( -o), mais aussi pour le contexte). Dans ce cas, il vous reste -mà dire à grep le nombre de lignes avec les résultats à renvoyer.
Attila O.30
17
L'utilisation de head n'empêche pas réellement grep de parcourir tout le fichier. L'utilisation de l'option -m dans grep le fait.
LopSae
7

Approche Awk:

awk '/pattern/{print; count++; if (count==10) exit}' file
Kurumi
la source
0

Utilisation de la queue:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 
Alex.gonzalez
la source
Vous pouvez définir le "formatage du code" en cliquant sur l'icône comme "{}" dans l'éditeur.
peterh - Réintégrer Monica
il serait utile de fournir des exemples plus lisibles que loooonl loooog liiines
Putnik
0

Pour 2 cas d'utilisation:

  1. Je veux seulement n résultats globaux, pas n résultats par fichier, l' grep -m 2occurrence maximale est par fichier.
  2. J'utilise souvent git grepce qui ne prend pas-m

Une bonne alternative dans ces scénarios est grep | sed 2qde grep les 2 premières occurrences sur tous les fichiers. documentation sed: https://www.gnu.org/software/sed/manual/sed.html

Emilie
la source