Bagaimana cara membatasi jumlah hasil yang dikembalikan dari grep?

180

Saya ingin mengatakan 10 baris maks dari grep.

Saya tidak ingin komputer saya bekerja keras. Saya ingin berhenti setelah 10 hasil ditemukan oleh grep. Apa itu mungkin?

Jas
sumber
Dalam kasus Anda, Anda tidak ingin komputer bekerja keras .. Tetapi jika itu hanya masalah keterbacaan manusia, Anda dapat menggunakan lessmelalui pipa. Itu akan memenuhi layar dan Anda dapat menekan ENTER untuk melihat lebih banyak garis dan quntuk keluar:grep "SomeText" somefile.csv | less
SilentSteel

Jawaban:

240

The -mpilihan adalah mungkin apa yang Anda cari:

grep -m 10 PATTERN [FILE]

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

Catatan: grep berhenti membaca file setelah jumlah kecocokan yang ditentukan ditemukan!

Erik Pilz
sumber
3
hai itu mencoba itu pada dasarnya bekerja tetapi tidak tampak seperti grep "berhenti" berpikir setelah dia menemukan 10 baris pertama sepertinya dia terus berpikir dan "menggunakan cpu saya" dan tidak hanya mencetak jika itu benar? thansk
Jas
6
@Jason: ini tampaknya tidak menjadi masalah: grep mengambil 0,005 dengan -m 1dan 1,579 tanpa pada file dengan 10 juta baris di laptop saya.
Grégoire
3
Perpipaan ke dalam tailumumnya akan bekerja, tetapi rusak terutama jika Anda memahami konteks, misalnya grep -A10 PATTERN, menggunakan tailtruncates the context, daripada jumlah hasil. Jawaban ini adalah apa yang saya cari.
dimo414
1
-m 10adalah opsi yang membuat perbedaan ketika menangkap beberapa file! Perpipaan ke kepala tidak akan menampilkan kecocokan di file berikutnya jika ada terlalu banyak kecocokan di file pertama. Terima kasih!
Julien
1
IMHO ini harus ditandai sebagai jawaban yang diterima, karena tidak memerlukan alat lain. BTW lebih mudah untuk mengingat opsi ini ketika mengetahui bahwa itu adalah jalan pintas --max-count
ishahak
68

Opsi lain hanya menggunakan kepala :

grep ...parameters... yourfile | head

Ini tidak akan memerlukan pencarian seluruh file - itu akan berhenti ketika sepuluh baris pertama yang cocok ditemukan. Keuntungan lain dengan pendekatan ini adalah bahwa akan mengembalikan tidak lebih dari 10 baris bahkan jika Anda menggunakan grep dengan opsi -o.

Misalnya jika file tersebut berisi baris berikut:

112233
223344
123123

Maka ini adalah perbedaan dalam output:

$ grep -o '1.' file Anda | kepala -n2
11
12

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

Menggunakan headpengembalian hanya 2 hasil yang diinginkan, sedangkan -m2 mengembalikan 3.

Mark Byers
sumber
3
Perhatikan bahwa Anda tidak dapat menggunakan | headpipa saat menggunakan grepdengan -Aatau -B(dan karenanya tidak hanya mencari hasil ( -o), tetapi juga untuk konteks). Dalam hal Anda pergi dengan -mmengatakan grep jumlah baris dengan hasil dikembalikan.
Attila O.
17
Menggunakan head tidak benar-benar menghentikan grep dari menjalankan seluruh file. Menggunakan opsi -m di grep tidak.
LopSae
7

Pendekatan awk:

awk '/pattern/{print; count++; if (count==10) exit}' file
kurumi
sumber
0

Menggunakan ekor:

#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
sumber
Anda dapat mengatur "pemformatan kode" dengan mengklik ikon seperti "{}" di editor.
peterh
itu akan berguna untuk memberikan contoh yang lebih mudah dibaca daripada loooonl loooog liiines
Putnik
0

Untuk 2 kasus penggunaan:

  1. Saya hanya ingin n hasil keseluruhan, bukan n hasil per file, itu grep -m 2adalah per file max kemunculannya.
  2. Saya sering menggunakan git grepyang tidak mengambil-m

Alternatif yang baik dalam skenario ini adalah grep | sed 2quntuk menangkap 2 kejadian pertama di semua file. dokumentasi sed: https://www.gnu.org/software/sed/manual/sed.html

Emily
sumber