Bir dosyanın yalnızca ilk n satırını grepleyebilir miyim?


126

Çok uzun günlük dosyalarım var, grep'ten yalnızca ilk 10 satırı aramasını istemek mümkün mü?

Yanıtlar:


175

Boruların büyüsü;

head -10 log.txt | grep <whatever>

13
isteğe bağlı bir akışı şu şekilde de aktarabilirsiniz head:someCmd | head -10
Stuart Nelson

1
Head varsayılan olarak ilk 10 satırı standart çıktıya yazdırmaktır, bu nedenle bu 10 satır için geçerlidirhead log.txt | grep <whatever>
Zlemini

5
Grep'in -lseçeneğini kullanırken bunu yapmanın bir yolu var mı ? İlk 5 karakteri olan tüm dosyaları listelemek istiyorum RIFFD.
James M. Lay

49

Bunu Google'da bulan kişiler için n, birden çok dosyanın ilk satırlarını aramam gerekiyordu, ancak yalnızca eşleşen dosya adlarını yazdırmam gerekiyordu. kullandım

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfile10 satır bir kez dosyası işlenirken durur görülmektedir. //..{}Üzerinde baskılar dosya adı ve hamle zaman belirli bir dosya gösterileri kadar ilk maçı. Diğer programların yararına dosya adlarından alıntı yapmak için şunu kullanın:

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
Bunu Google'da bulanlardan biriydim. Teşekkürler!
Floris

benim için bu kod dosyanın tam yolunu yazdırdı. Tam da ihtiyacım olan şey buydu. Ayrıca FNR=1sadece 1. satırı arayacaktır. Teşekkürler!
Brian W

2
Bunu bir dizin üzerinden yinelemeli olarak yapmak için:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
Teşekkürler @OrangeDog. Küçük bir düzeltme: olmalı-type f
David Siegal

26

Veya awktek bir işlem için kullanın |:

awk '/your_regexp/ && NR < 11' INPUTFILE

Her satırda, your_regexpeşleşiyorsa ve kayıt sayısı (satır) 11'den azsa, varsayılan eylemi (giriş satırını yazdıran) yürütür.

Veya şunu kullanın sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

Normal ifadenizi kontrol eder ve satırı yazdırır ( -naksi takdirde varsayılan olan girdiyi yazdırmayın anlamına gelir) ve 10. satırdan hemen sonra çıkar.


1
Neden 10'unda bırakmıyorsun? (sed çözümüne bakın)
Potong

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- Daha hızlı.

1
@potong haklısın, düzeltildi. @srikanthradix daha hızlı olabilirken, çözümünüz normal ifadeler değil, yalnızca sabit dizeler arıyor. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileyapar.
Zsolt Botykai

4
Artı stil değil awkish. 2xifsve 1xelseeylem ifadesine ihtiyaç duymayan bir komutta aho olur. weinberger ve kernighan ağlıyor ...
jaypal singh

1
Bence, NR yerine FNR kullanmak daha iyi olur, çünkü çok sayıda dosyayla awk kullanırsanız FNR her dosya için 0'dan başlar.
Vladyslav Savchenko

9

İle birlikte programları kullanarak birkaç seçeneğiniz var grep. Bence en basit olanı kullanmak head:

head -n10 filename | grep ...

headilk 10 satırın çıktısını alır ( -nseçeneği kullanarak ) ve sonra bu çıktıyı borulayabilirsiniz grep.


6
Hatta burada kullanan tüm çözümler, fark etmedi headkullandık -n 10 (ben dahil) hayata değil headtarafından varsayılan görüntüler sadece 10 satır . :)
jaypal singh



3

Bunu başarmak head -10 fileiçin çıktı borulanabilir grep:

head -10 file | grep 

Perl Kullanımı:

perl -ne 'last if $. > 10; print if /pattern/' file

3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: desenden önce iki satır yazdırın.

-B 2: desenden sonra iki satır yazdırın.

head -10 log.txt # read the first 10 lines of the file.

1
Hatırlarsam, -C 2aynısını yapacağım-A 2 -B 2
David LeBauer

3
grep -m6 "string" cov.txt

Bu sadece ilk 6 satırı arar string


3
Hayır, bu size tüm cov.txt dosyasında "string" ifadesinin ilk 6 oluşumunu verecektir
franzisk

2

Joachim Isaksson cevabı bir uzantısı: Oldukça sık bu durumda birleştirebilirsiniz, 5020 örneğin uzun dosyanın ortasından şey, çizgiler 5001 lüzum headile tail:

head -5020 file.txt | tail -20 | grep x

Bu ilk 5020 satırını alıyor, sonra bunların sadece son 20'sini gösteriyor, sonra her şeyi grep'e aktarıyor.

(Düzenlendi: örnek numaralarımda çitpost hatası, grep'e boru eklendi)


1

grep -A 10 <Pattern>

Bu, deseni ve desenden sonraki 10 satırı almak içindir. Bu, yalnızca bilinen bir kalıp için işe yarar, eğer bilinen bir kalıbınız yoksa "baş" önerilerini kullanın.


1
Doğru olsa da. Yanıtı daha kapsamlı hale getirmek için daha fazla soru açıklaması ekleyin.
Pramod S. Nikam

3
Bu, tamamen farklı bir soruyu yanıtlar ve bu bağlamda yararlı değildir.
2018 öncesi

-1

Benzer bir problemim vardı ve yukarıdaki problemlerin tümü onu tamamen çözmüyor. Eşleşen satırları içeren dosya adını almakla da ilgileniyorum. Çözümüm:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

Not: Benim durumumdaki Desen her zaman ilk satırla eşleşir.

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.