Grep'ten döndürülen sonuç sayısını nasıl sınırlayabilirim?


180

Grep'ten maksimum 10 satır söylemek istiyorum.

Bilgisayarımın çok çalışmasını istemiyorum. Grep tarafından bulunan 10 sonuçtan sonra durmasını istiyorum. Mümkün mü?


Senin durumunda bilgisayarın çok çalışmasını istemiyorsun .. Ama bu sadece insanın okuyabildiği bir problemse, lessbir boru ile kullanabilirsin . Bu ekranı dolduracak ve daha fazla satır görmek ve qçıkmak için ENTER tuşuna basabilirsiniz :grep "SomeText" somefile.csv | less
SilentSteel

Yanıtlar:


240

-mSeçenek aradığınızı muhtemelen:

grep -m 10 PATTERN [FILE]

Gönderen 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.

Not: grep, belirtilen sayıda eşleşme bulunduğunda dosyayı okumayı durdurur!


3
merhaba o temelde çalışıyor denedim ama o düşünmeye devam ediyor ve "cpu kullanarak" ve sadece printint değil gibi görünüyor ilk 10 satır bulduktan sonra grep "durur" düşünüyor gibi görünmüyor düzeltmek mi? thansk
Jas

6
@Jason: durum böyle değil: grep, -m 1dizüstü bilgisayarımda 10 milyon satırlık bir dosya olmadan 0.005 ve 1.579'ları alıyor .
Grégoire

3
İçine geçme tailgenellikle işe yarar, ancak özellikle bağlamla selamlanırsanız, örneğin grep -A10 PATTERN, tailsonuçların sayısı yerine bağlamı kısaltırsa bozulur . Bu cevap aradığım şeydi.
dimo414

1
-m 10birden fazla dosya açarken fark yaratan seçenektir! İlk dosyada çok fazla eşleşme varsa, başa yöneltme sonraki dosyalarda eşleşmeleri göstermez. Teşekkürler !
Julien

1
IMHO bu başka bir araç gerektirmediği için kabul edilen cevap olarak işaretlenmelidir. BTW --max-count
ishahak'ın

68

Başka bir seçenek sadece kafa kullanmaktır :

grep ...parameters... yourfile | head

Bu, tüm dosyanın aranmasını gerektirmez - ilk on eşleşen satır bulunduğunda durur. Bu yaklaşımın bir diğer avantajı, -o seçeneğiyle grep kullansanız bile 10 satırdan fazla döndürmeyecek olmasıdır.

Örneğin, dosya aşağıdaki satırları içeriyorsa:

112233
223344
123123

O zaman çıktıdaki fark budur:

$ grep -o '1.' dosya | kafa -n2
11
12

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

Kullanmak headistendiği gibi yalnızca 2 sonuç verirken -m2 3 değerini döndürür.


3
| headBoruyu veya grepile kullanırken kullanamazsınız (ve bu nedenle yalnızca sonuç ( ) için değil, bağlam için de). Bu durumda, grep'e döndürülecek sonuçların bulunduğu satır sayısını söylemeye devam edersiniz . -A-B-o-m
Attila O.

17
Head kullanmak aslında grep'in tüm dosya boyunca çalışmasını durdurmaz. Grep içinde -m seçeneği kullanılır.
LopSae

7

Awk yaklaşımı:

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

0

Kuyruk kullanarak:

#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$ 

Düzenleyicide "{}" gibi simgeyi tıklayarak "kod biçimlendirmesi" ni ayarlayabilirsiniz.
peterh - Monica

loooonl loooog liiines'ten daha okunabilir örnekler sunmak yararlı olacaktır
Putnik

0

2 kullanım durumu için:

  1. Sadece n genel sonuç istiyorum, dosya başına n sonuç değil, grep -m 2dosya maks.
  2. Sık sık kullanmak git grepalmaz hangi-m

Bu senaryolarda iyi bir alternatif, grep | sed 2qtüm dosyalarda ilk 2 olayı grep etmektir . sed belgeleri: https://www.gnu.org/software/sed/manual/sed.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.